【问题标题】:removed records merge cells from /xl/worksheets/sheet1.xml part coldfusion poi从 /xl/worksheets/sheet1.xml 部分中删除记录合并单元格 Coldfusion poi
【发布时间】:2016-01-22 10:08:15
【问题描述】:

我正在使用 java poi 库创建一个 excel 文件,它被创建但是当我打开文件时,excel 会弹出一条消息说 “我们发现文件内容存在问题。您是否希望我们尽可能多地恢复。如果您信任工作簿的来源。”

单击“是”时,会弹出“已修复部件:/xl/worksheets/sheet1.xml 部件,出现 XML 错误。加载错误。第 121 行,第 0 列。 删除记录:从 /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>

【问题讨论】:

  • 看起来您使用的是 Apache POI 3.9?更新到最新版本后会发生什么?

标签: excel coldfusion apache-poi


【解决方案1】:

This thread 表明较新的格式可能对重叠或重复的容忍度较低。检查您的 CF 代码,看看它是否无意中创建了任何重复或冲突的区域。

我能够在 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 并搜索“mergeCells”。这应该会为您指明正确的方向。

更新:

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

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

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

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

【讨论】:

  • 谢谢 Leigh 的回答,我在 open xml sdk 工具中打开了 excel 表,但没有找到任何常见的合并区域。以下是供您参考的内容:
  • 编辑问题以包含 sheet1 的 mergecell xml 内容。
  • @Leigh 感谢您的回答。使用 python 生成 excel 工作表时,我遇到了同样的问题。
  • 一个乏味但可行的解决方案是“每次开始 setMerg(...) 时检查合并状态或向单元格添加 delMerge(...)”。
猜你喜欢
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多