2016-01-22 564 views
2

我创建了一个带有java poi库的excel文件,它被创建,但是当我打开该文件时,excel弹出一条消息,说 “我们发现了一些问题与文件的内容有关。您是否希望我们尽可能地恢复原状,如果您信任工作簿的来源。“从/xl/worksheets/sheet1.xml部分删除记录合并单元部分coldfusion poi

在点击是的,它会弹出“修复部分:/xl/worksheets/sheet1.xml部分与XML错误加载错误121行,列0 删除记录:合并细胞/ XL /工作表/工作表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> 
+0

看起来您使用的是Apache POI 3.9?当你更新到最新版本时会发生什么? – Gagravarr

回答

5

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的mergedcell节点,它看起来像一个号码的区域重叠,或者是可能无效。例如,前两个区域结束于列AW,行1。 (由于第二区域上行2开始,我不知道终点,甚至有效?)

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

不管怎么说,调整范围,使他们不重叠(例如,如果第二范围结束在列AW,行2)应该解决该错误。

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

谢谢Leigh为您解答,我打开了在开放式xml sdk工具中的excel表单,但没有找到任何常见的合并区域。以下是供您参考的内容: – Ritu

+0

已编辑的问题包括sheet1的mergercell xml内容。 – Ritu