从/xl/worksheets/sheet1.xml部分coldfusion poi删除logging合并单元格

我正在用java poi库创build一个excel文件,但它被创build,但是当我打开文件时,excelpopup一条消息:“我们发现文件内容存在一些问题。您是否希望我们尝试恢复尽可能多的如果你相信工作簿的来源。“

在点击是的时候,它会popup“已修复的零件:/xl/worksheets/sheet1.xml零件,出现XML错误,加载错误,第121行,第0列。已删除的logging:从/xl/worksheets/sheet1.xml零件中合并单元格”。

而且文件中没有数据丢失,我无法得到excel错误背后的原因。

我不能在这里写出整个代码,但这里是与xlsx文件相关的主要内容:

<cfdirectory action="list" directory="#expandPath('/poi_39')#" name="poidir"/> <cfset paths = arrayNew(1)> <cfloop query="poidir"> <cfset arrayAppend(paths, directory & "\" & name) /> </cfloop> <cfset server.loader = createObject("component", "javaloader.JavaLoader").init(loadPaths=paths, loadColdFusionClassPath=true) /> <cfscript> _Thread = createObject("java", "java.lang.Thread"); currentClassloader = _Thread.currentThread().getContextClassLoader(); try { // Set the current thread's context class loader as Javaloader's classloader, so dom4j doesn't die _Thread.currentThread().setContextClassLoader(server.loader.getURLClassLoader()); //code found online //inp = createObject("java", "java.io.FileOutputStream").init("#fullpath#"); //reseting the value on code inp = 100; //workBook = server.loader.create("org.apache.poi.xssf.usermodel.XSSFWorkbook").Init(inp); workBook = server.loader.create("org.apache.poi.xssf.streaming.SXSSFWorkbook").Init(inp); } catch(Any exc) { rethrow; } finally { // We have to reset the classloader, due to thread pooling. _Thread.currentThread().setContextClassLoader(currentClassloader); } </cfscript> <!--- New code ends---> <cfset cellstyle = workbook.createCellStyle()> <cfset fontface = workbook.createFont()> <cfset fontface.setBoldweight(fontface.BOLDWEIGHT_BOLD)> <cfset cellstyle.setFont(fontface)> <cfset cellstyleData = workbook.createCellStyle()> <cfset format = workbook.createDataFormat() > <cfset cellintstyle = workbook.createCellStyle()> <cfset cellintstyle.setDataFormat(format.getFormat("0"))> <cfset cellfloatstyle = workbook.createCellStyle()> <cfset cellfloatstyle.setDataFormat(format.getFormat("0.0##"))> <cfset cellstyleData.setWrapText(true)/> <cfset cellstyleforallrows = workbook.createCellStyle()> <cfset fontfaceforallrows = workbook.createFont()> <cfset fontfaceforallrows.setColor(CreateObject( "java","org.apache.poi.hssf.util.HSSFColor$BLUE").getIndex())> <cfset cellstyleforallrows.setFont(fontfaceforallrows)> <cfset cellstyleforallrows.setWrapText(true)/> 

  <!--- creating new row object for the LEGEND title---> <cfset rowLegend = newSheetLegend.createRow(0)/> <!--- Assigning the sheet name Legend---> <cfset workBook.setSheetName(0, "LEGEND")/> <!--- First Row First column text should be LEGEND. Giving that in bold ---> <cfset cellLegend = rowLegend.createCell(0)/> <cfset cellStyleStatic = createObject("java","org.apache.poi.xssf.usermodel.XSSFCellStyle")/> <cfset cellLegend.setCellStyle(cellstyle)/> <cfset cellLegend.setCellValue("LEGEND")/> <cfset region = server.loader.create("org.apache.poi.ss.util.CellRangeAddress").init(0,0,0,48)/> <cfset newSheetLegend.addMergedRegion(region)/> 

网上也没有得到任何相关的东西,有没有人遇到过这样的问题? 如果是的话,帮我解决这个问题。 谢谢

以下是sheet1的mergecell xml的xml内容:

 <x:mergeCells xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> <x:mergeCell ref="A1:AW1" /> <x:mergeCell ref="B2:AW1" /> <x:mergeCell ref="C3:AW1" /> <x:mergeCell ref="D4:AW1" /> <x:mergeCell ref="E5:AW1" /> <x:mergeCell ref="F6:AW4" /> <x:mergeCell ref="G7:C1" /> <x:mergeCell ref="G7:AW4" /> <x:mergeCell ref="H8:AW4" /> <x:mergeCell ref="I9:AW4" /> <x:mergeCell ref="J10:AW4" /> <x:mergeCell ref="K11:AW4" /> <x:mergeCell ref="L12:AW4" /> <x:mergeCell ref="M13:AW4" /> <x:mergeCell ref="N14:AW4" /> <x:mergeCell ref="O15:AW4" /> <x:mergeCell ref="P16:AW4" /> <x:mergeCell ref="Q17:AW4" /> <x:mergeCell ref="R18:AW4" /> <x:mergeCell ref="S19:AW4" /> <x:mergeCell ref="T20:AW4" /> <x:mergeCell ref="U21:AW4" /> <x:mergeCell ref="V22:AW4" /> <x:mergeCell ref="W23:AW4" /> <x:mergeCell ref="X24:AW4" /> <x:mergeCell ref="Y25:AW4" /> <x:mergeCell ref="Z26:AW4" /> <x:mergeCell ref="AA27:AW4" /> <x:mergeCell ref="AB28:AW4" /> <x:mergeCell ref="AC29:AW4" /> <x:mergeCell ref="AD30:AW4" /> <x:mergeCell ref="AE31:AW4" /> <x:mergeCell ref="AF32:AW4" /> <x:mergeCell ref="AG33:AW4" /> <x:mergeCell ref="AH34:AW4" /> <x:mergeCell ref="AI35:AW4" /> <x:mergeCell ref="AJ36:AW4" /> <x:mergeCell ref="AK37:AW4" /> <x:mergeCell ref="AL38:AW4" /> <x:mergeCell ref="AM39:AW4" /> <x:mergeCell ref="AN40:AW4" /> <x:mergeCell ref="AO41:AW4" /> <x:mergeCell ref="AP42:AW4" /> <x:mergeCell ref="AQ43:AW4" /> <x:mergeCell ref="AR44:AW4" /> <x:mergeCell ref="AS45:AW4" /> <x:mergeCell ref="AT46:AW4" /> <x:mergeCell ref="AU47:AW4" /> <x:mergeCell ref="AV48:AW4" /> <x:mergeCell ref="AW49:AW4" /> <x:mergeCell ref="AX50:AW4" /> <x:mergeCell ref="AY51:AW4" /> <x:mergeCell ref="AZ52:AW4" /> </x:mergeCells> 

这个线程表明新的格式可能不太容忍重叠或重复。 检查您的CF代码,看它是否无意中创build任何重复或冲突的地区。

在POI 3.9和3.13下,我可以通过将相同区域添加到电子表格两次,或通过更新现有文件并添加一个已经存在(或冲突)电子表格中现有区域的区域来重现错误。 用zip工具打开文件,用记事本检查/xl/worksheets/sheet1.xml文件,发现合并的单元节点被添加了两次:

 <mergeCells> <mergeCell ref="A1:AW1"/> <mergeCell ref="A1:AW1"/> </mergeCells> 

“修复”文件后,重复的节点被删除(当然错误消失了):

 <mergeCells> <mergeCell ref="A1:AW1"/> </mergeCells> 

再次检查添加区域的任何CF代码。 如果您仍然不确定哪部分代码导致问题,请尝试查看/xl/worksheets/sheet1.xml并search“mergeCells”。 这应该指向正确的方向。

更新:

查看sheet1.xml中的合并单元节点,看起来好像有多个区域重叠,或者可能无效。 例如,前两个区域都在AW列第1行结束。 (由于第二个区域从第二开始,我不确定终点是否有效?)

 <x:mergeCell ref="A1:AW1" /> <x:mergeCell ref="B2:AW1" /> 

无论如何,调整范围以使它们不重叠(例如,如果第二个范围在AW 列第2行结束)应该解决错误。

 <x:mergeCell ref="A1:AW1" /> <x:mergeCell ref="B2:AW2" />