关于客户的机器加密问题,造成写Excel出现错误(只限于有名称管理器的情况下)
问题:如果你用名称管理的话,在你读取名称管理器的信息后,如果中途读取数据的时间过长,然后后面就是输出数据了。这个时候代码就会报错。
java.lang.RuntimeException java.lang.RuntimeException: org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13] at com.hfplm.customization.export.history.HFBatchVersionExportHandler.export(HFBatchVersionExportHandler.java:334) at com.hfplm.customization.export.history.HFBatchVersionExportHandler.access$6(HFBatchVersionExportHandler.java:308) at com.hfplm.customization.export.history.HFBatchVersionExportHandler$1.run(HFBatchVersionExportHandler.java:225) Caused by: org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13] at org.apache.poi.util.PackageHelper.open(PackageHelper.java:41) at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:204) at com.hfplm.customization.export.history.HFBatchVersionExportHandler.export(HFBatchVersionExportHandler.java:315) ... 2 more Caused by: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13] at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:178) at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:662) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:269) at org.apache.poi.util.PackageHelper.open(PackageHelper.java:39) ... 4 more
分析报错原因:
首先是读取名称管理器那里,已经需要一次输入流了。后面虽然关闭了,但是加密机器的原理应该是,扫描到了这个文件有过一次读取后,就会进行加密。
后面你再进行数据输出时,又进行了一次输入流的读取。这个时候又会报错。
注意:如果你的读取名称管理器的输入流时间----》中间处理数据----》再读取输入流。如果中间的处理数据的时间足够短,就不会出现报错的情况。我想是因为机器也是需要一定的时间进行扫描的。
解决办法:解决办法其实很简单。就是你在读取完名称管理器后,把XSSFWorkbook对象返回取,因为后面你存数据的时候,也是需要这个对象的,而不是重新需要输入流。
public static Map<String, Object> getNameMap2(File file){ Map<String,Object> objectMap = new HashMap<>(); Map<String, int[]> nameMap = null; FileInputStream inputStream = null; XSSFWorkbook workbook = null; try { inputStream = new FileInputStream(file); workbook = new XSSFWorkbook(inputStream); inputStream.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try{ nameMap = ExcelUtil.getnamesAt(workbook); objectMap.put("nameMap", nameMap); objectMap.put("workbook", workbook); }catch(Exception e) { e.printStackTrace(); MSG.systemErrorinfo(e); } return objectMap; }