Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于windows系统下temp目录生成大量eec文件的问题 #296

Open
zhangwx95 opened this issue Oct 18, 2022 · 16 comments
Open

关于windows系统下temp目录生成大量eec文件的问题 #296

zhangwx95 opened this issue Oct 18, 2022 · 16 comments
Labels

Comments

@zhangwx95
Copy link

发现windows下用户路径,AppData\Local\Temp每跑一次任务,就会生成对应的eec文件和文件夹
该路径可以设置吗?或者每次跑完任务能自动删除eec文件,每次读取几百兆的数据,不要几次就会把c盘撑满了

@wangguanquan
Copy link
Owner

如果是读的话可以使用try-with-resource来释放,如果是写的话不需要特殊处理程序会自清理,但是如果中间抛异常的情况除外

@zhangwx95
Copy link
Author

如果是读话中间可以使用try-with-resource来释放,如果是写的话,如果有特殊处理程序会自收集,但抛抛异常的情况除外

明白了,第一次知道try-with-resource哈哈哈,新知识get,谢谢

@wangguanquan
Copy link
Owner

放在临时文件的好处是可以被磁盘清理程序清理,linux也会自动清理tmp目录,除非一次将c盘写满否则不用太过在意,如果你是刚接触eec可以先查看一下wiki

@zhangwx95
Copy link
Author

zhangwx95 commented Oct 18, 2022

放在临时文件的好处是可以被磁盘清理程序清理,linux也会自动清理tmp目录,除非一次将c盘写满否则不用太过在意,如果你是刚接触eec可以先查看一下wiki

嗯嗯,这两天才开始接触使用,因为easyexcel读大文件内存爆了,在网上找到了eec。

我这边还有个问题,使用sheet的迭代器,发现我有一份文件无法读取,会直接跳过循环,不进入循环体。当我添加代码里注释的那一行,又能进入循环了,其它的excel文件能正常读取
很抱歉我无法提供原始数据,这份数据打开看都是正常的。想请教下,之前有遇到这种问题吗?或者怎么才能找到这份文件和其它文件的不同?谢谢

try (ExcelReader excelReader = ExcelReader.read(Paths.get(filePath))) {
            
//        excelReader.sheet(0).dataIterator().hasNext();

            for (Iterator<Row> ite = excelReader.sheet(0).dataIterator(); ite.hasNext(); ) {
                String oneLine = ite.next().toString();
                System.out.println(oneLine);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

@wangguanquan
Copy link
Owner

没有遇到过这种情况,使用excelReader.sheet(0).iterator()看看会出现什么情况,或者使用流读取看下效果reader.sheet(0).dataRows().forEach(System.out::println);,或者添加System.out.println(excelReader.getAppInfo()); 打印一下文件属性我看下是什么工具生成的

@zhangwx95
Copy link
Author

没有遇到过这种情况,使用excelReader.sheet(0).iterator()看看会出现什么情况,或者使用流读取看下效果reader.sheet(0).dataRows().forEach(System.out::println);,或者添加System.out.println(excelReader.getAppInfo()); 打印一下文件属性我看下是什么工具生成的

1.使用excelReader.sheet(0).iterator()看看会出现什么情况
A:和dataIterator()是一样的,没进入循环

2.使用流读取看下效果
A:没有任何打印输出,不过使用excelReader.sheet(0).dataRows().toArray()最终会得到文件行数大小的object数组,内容全是最后一行数据

try (ExcelReader excelReader = ExcelReader.read(Paths.get(filePath))) {

            excelReader.sheet(0).dataRows().forEach(System.out::println);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.添加System.out.println(excelReader.getAppInfo()); 打印一下文件属性我看下是什么工具生成的
A:
文件属性为
Application: Apache POI
Creator: Apache POI

新的发现:当我用wps打开这份有问题的数据,重新保存一下(不是另存为,就是随便操作了下,又撤回,然后保存),重新读取就成功了。。。

@wangguanquan
Copy link
Owner

设计时内部是共享的,所以不能直接使用toArray方法收集数据。

使用下面代码打印worksheet头数据发到我邮箱看一下就行,不涉及信息安全(点我头像可以查看邮箱)

try {
    Field field = XMLSheet.class.getDeclaredField("cb");
    field.setAccessible(true);
    char[] cb = (char[]) field.get(reader.sheet(0));
    System.out.println(new String(cb, 0, 1024)); // TODO 调整这里的长度直到<row r="1"末尾(第一行)
} catch (NoSuchFieldException | IllegalAccessException e) {
    e.printStackTrace();
}

@zhangwx95
Copy link
Author

zhangwx95 commented Oct 18, 2022

设计时内部是共享的,所以不能直接使用toArray方法收集数据。

使用下面代码打印worksheet头数据发到我邮箱看一下就行,不涉及信息安全(点我头像可以查看邮箱)

try {
    Field field = XMLSheet.class.getDeclaredField("cb");
    field.setAccessible(true);
    char[] cb = (char[]) field.get(reader.sheet(0));
    System.out.println(new String(cb, 0, 1024)); // TODO 调整这里的长度直到<row r="1"末尾(第一行)
} catch (NoSuchFieldException | IllegalAccessException e) {
    e.printStackTrace();
}

cb的长度是8192,但是还没到表头的最后一列,表头实在太长了。。。表头包含括号,冒号,百分号等特殊符号
实在抱歉公司没法外发邮件,我截取前面一部分给你吧

<?xml version="1.0" encoding="UTF-8"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><dimension ref="A1"/><sheetViews><sheetView workbookViewId="0" tabSelected="true"/></sheetViews><sheetFormatPr defaultRowHeight="15.0"/><sheetData>
<row r="1">
<c r="A1" s="1" t="inlineStr"><is><t>开始时间</t></is></c>
<c r="B1" s="1" t="inlineStr"><is><t>结束时间</t></is></c>
<c r="C1" s="1" t="inlineStr"><is><t>粒度</t></is></c>




结尾到这就截止了

<c r="DB1" s="1" t="inlineStr"><is><t>C6162

@wangguanquan
Copy link
Owner

使用System.out.println(reader.sheet(0).getDimension());看一下有效范围

可以debug下XMLSheet#nextRow方法,看第一行的读取哪里有问题

@zhangwx95
Copy link
Author

使用System.out.println(reader.sheet(0).getDimension());看一下有效范围

可以debug下XMLSheet#nextRow方法,看第一行的读取哪里有问题

有效范围 A1:A46152,但是excel实际范围应该是A1:EL46152

debug下,reader.sheet(0).nextRow() 结果正常,读取了第一行表头的所有内容,和xlsx的内容一致,共142列

@wangguanquan
Copy link
Owner

降到0.5.3版本试一下有没有这个问题,或者04.x也可以试试,不能复现我不太确定问题出在哪里,历史版本可以在 wiki 中查看

@zhangwx95
Copy link
Author

降到0.5.3版本试一下有没有这个问题,或者04.x也可以试试,不能复现我不太确定问题出在哪里,历史版本可以在 wiki 中查看

0.5.3的问题更严重了,getDimension()就是A1,getHeader()表头不完整,从表头的中间某个位置(第106列才开始有内容,其余均为null,共141列)开始才有数据
但是呢reader.sheet(0).nextRow()结果正常,表头内容完整

@wangguanquan
Copy link
Owner

wangguanquan commented Oct 21, 2022 via email

@wangguanquan
Copy link
Owner

我新开了一个issue讨论iterator出现的BUG问题,本issue标记为QA回答tmp目录临时文件

@wangguanquan
Copy link
Owner

#297 分支已修复你反馈的问题,你可以fork本项目切换到 fix#297 分支测试,因为我没有测试文件,所以还请将测试结果反馈到 issue#297 ,多谢。

@wangguanquan
Copy link
Owner

使用最新版本v0.5.5测试是否已修复跳出循环问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants