关于客户的机器加密问题,造成写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;
 }

  

 

posted @ 2022-11-08 15:18  信铁寒胜  阅读(87)  评论(0编辑  收藏  举报