The supplied data appears to be in the Office 2007+ XML

秒速五厘米 2022-06-17 04:15 1008阅读 0赞

1、错误描述

  1. org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
  2. at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:152)
  3. at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140)
  4. at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:302)
  5. at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:87)
  6. at com.you.print.ExcelUtils.replaceModel(ExcelUtils.java:20)
  7. at com.you.print.TestReplaceExcel.main(TestReplaceExcel.java:28)

2、错误原因

  1. org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
  2. at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:152)
  3. at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140)
  4. at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:302)
  5. at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:87)
  6. at com.you.print.ExcelUtils.replaceModel(ExcelUtils.java:20)
  7. at com.you.print.TestReplaceExcel.main(TestReplaceExcel.java:28)
  8. /**
  9. *
  10. */
  11. package com.you.print;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. /**
  15. * @author Administrator
  16. *
  17. */
  18. public class TestReplaceExcel
  19. {
  20. /**
  21. * @param args
  22. */
  23. public static void main(String[] args)
  24. {
  25. List<ReplaceExcelData> list = new ArrayList<ReplaceExcelData>();
  26. ReplaceExcelData red = new ReplaceExcelData();
  27. red.setColumn(2);
  28. red.setRow(6);
  29. red.setKey("1");
  30. red.setValue("111111");
  31. list.add(red);
  32. ExcelUtils.replaceModel(list, "D:\\myeclipseworkspces\\Print\\model\\WeightBill.xlsx", "D:\\myeclipseworkspces\\Print\\model\\Bill.xlsx");
  33. }
  34. }
  35. package com.you.print;
  36. import java.io.FileInputStream;
  37. import java.io.FileOutputStream;
  38. import java.util.List;
  39. import org.apache.poi.hssf.usermodel.HSSFCell;
  40. import org.apache.poi.hssf.usermodel.HSSFRow;
  41. import org.apache.poi.hssf.usermodel.HSSFSheet;
  42. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  43. import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  44. public class ExcelUtils
  45. {
  46. public static boolean replaceModel(List<ReplaceExcelData> datas, String sourceFilePath, String targetFilePath)
  47. {
  48. boolean bool = true;
  49. try
  50. {
  51. POIFSFileSystem fs =new POIFSFileSystem(new FileInputStream(sourceFilePath));
  52. HSSFWorkbook wb = new HSSFWorkbook(fs);
  53. HSSFSheet sheet = wb.getSheetAt(0);
  54. for (ReplaceExcelData data : datas) {
  55. //获取单元格内容
  56. HSSFRow row = sheet.getRow(data.getRow());
  57. HSSFCell cell = row.getCell((short)data.getColumn());
  58. String str = cell.getStringCellValue();
  59. //替换单元格内容
  60. str = str.replace(data.getKey(), data.getValue());
  61. //写入单元格内容
  62. cell.setCellType(HSSFCell.CELL_TYPE_STRING);
  63. cell.setCellValue(str);
  64. }
  65. // 输出文件
  66. FileOutputStream fileOut = new FileOutputStream(targetFilePath);
  67. wb.write(fileOut);
  68. fileOut.close();
  69. }
  70. catch (Exception e)
  71. {
  72. bool = false;
  73. e.printStackTrace();
  74. }
  75. return bool;
  76. }
  77. }

关键问题的原因还是excel2003和excel2007版本的问题

3、解决办法

(1)判断文件后缀名是xls,还是xlsx

(2)如果是xls,使用HSSFWorkbook;如果是xlsx,使用XSSFWorkbook

发表评论

表情:
评论列表 (有 0 条评论,1008人围观)

还没有评论,来说两句吧...

相关阅读