新手求助关于POI创建excel无法打开以及空文件错误的问题

哇靠没名字 2020-01-21 11:54:23
小弟新手,自学文转理,在使用POI创建excel的时候,遇到如下错误信息:
org.apache.poi.EmptyFileException: The supplied file was empty (zero bytes long)
at org.apache.poi.util.IOUtils.peekFirstNBytes(IOUtils.java:82)
at org.apache.poi.util.IOUtils.peekFirst8Bytes(IOUtils.java:65)
at org.apache.poi.poifs.filesystem.FileMagic.valueOf(FileMagic.java:160)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:225)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:198)
at util.ExcelUtil.getWorkBook(ExcelUtil.java:76)
at model.Action.writeDataToLocalFile(Action.java:29)
at test.MainTest.testWriteData(MainTest.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
业务需求:
读取大量网络数据写入本地excel文件,如果文件不存在,创建并写入内容,如果文件存在,追加内容。
附代码:

获取workbook
public static Workbook getWorkBook(String path) {
Workbook workbook = null;
InputStream is = null;
Sheet sheet = null;
try {
is = new FileInputStream(ExcelUtil.getFile(path));
workbook = WorkbookFactory.create(is);
// 看了有兄弟说代码创建的Exel文件因为没有sheet导致打开报错(直接新建excel默认三个sheet)然而这代码无用
if (workbook.getNumberOfSheets() == 0) {
sheet = workbook.createSheet("sheet1");
Row row = sheet.createRow(0);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return workbook;
}

创建文件
public static File getFile(String path) {
File file = new File(path);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
e.getLocalizedMessage();
e.getMessage();
}
}
return file;
}

数据写入
 public static void writeDataToLocalFile(String path,String[] fields, List<Object> data) {
System.out.println("start to writing............");
Workbook workbook = null;
FileOutputStream fos = null;
Sheet sheet = null;
try {
workbook = ExcelUtil.getWorkBook(path);
sheet = workbook.getSheetAt(0);
if (null == sheet.getRow(0)) {
Row header = sheet.createRow(0);
for (int i = 0; i < fields.length; i++) {
Cell cell = header.createCell(i);
cell.setCellValue(fields[i]);
}
}
if (null != data) {
for (int i = 0; i < data.size(); i ++){
List<String> list = MatchData.parseBeanToList(data.get(i));
System.out.println("当前已有 " + sheet.getPhysicalNumberOfRows() + " 行数据");
Row dataRow = sheet.createRow(sheet.getPhysicalNumberOfRows());
for (int j = 0; j < list.size(); j++) {
Cell cell = dataRow.createCell(j);
cell.setCellValue(list.get(j));
}
}
}
fos = new FileOutputStream(ExcelUtil.getFile(path));
workbook.write(fos);
} catch (Exception e) {
System.out.println("error....");
e.printStackTrace();
e.getLocalizedMessage();
e.getMessage();
} finally {
ExcelUtil.close(fos,workbook);
}
System.out.println("finished");
}


运行结果:
1、如果本地文件已经存在,写入和追加数据正常
2、如果本地文件不存在,通过程序创建一个excel文件的话,报错,错误信息如帖子开头。

穷人无B,20个希望大神能援手指点
...全文
3340 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssw_jack 2020-02-05
  • 打赏
  • 举报
回复
用Free Spire.XSL for Java创建Excel比POI简单很多
qq_39936465 2020-01-22
  • 打赏
  • 举报
回复
一般新的xlsx 需要用Workbook wb = new XSSFWorkbook();来创建
qq_39936465 2020-01-22
  • 打赏
  • 举报
回复
引用 楼主 哇靠没名字 的回复:
小弟新手,自学文转理,在使用POI创建excel的时候,遇到如下错误信息: 运行结果: 1、如果本地文件已经存在,写入和追加数据正常 2、如果本地文件不存在,通过程序创建一个excel文件的话,报错,错误信息如帖子开头。 穷人无B,20个希望大神能援手指点
你用file.createNewFile(); 来创建新文件肯定有问题,必须通过new FileOutputStream("createWorkBook.xlsx");来写入,不然识别不出是xlsx文件。office应该都有表头,不能用file直接建,建好了也打不开该文件。
qq_39936465 2020-01-22
  • 打赏
  • 举报
回复
然后写入才会有效,旧文件本身已经有格式了,所以不需要。 所以你writeDataToLocalFile方法中下面的语句是有问题的, workbook = ExcelUtil.getWorkBook(path);

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧