我在这里找了很多次答案,但这是我第一次问我自己的问题。我有大约15年的Cf与版本4-10的经验,所以,虽然我不是专家,我知道我正在做的大多数事情。
我目前有一个项目,我接管了另一个开发人员。应用程序的一部分将数据从Server 2008数据库输出到一个Excel文件,该文件有三个按顺序从左到右创建的工作表或选项卡。我正在努力解决一个问题,在打开Excel文件时,第一页和第三页是“分组”的。在标题栏的文件名旁边,显示Group和两个工作表都处于活动状态。这样做的问题是,如果用户要在第3页中突出显示第5行,那么第5行也会在第1页中高亮显示。我已经用我能想到的每一个搜索字符串搜索了各地,却找不到任何东西!我甚至尝试基于CF文档重新创建功能框架,并遇到了同样的问题。我自己想出了几件事。
首先,中间页一点也不受影响。其次,在Excel中,如果选择中间工作表,其他一切都会被修复(当然,对于最终用户来说,这不是一个很好的解决方案)。第三,如果我用"xmlformat“等于"false”创建电子表格,并将其输出为"xls",那么这个问题就没有了。最后,我尝试添加一行额外的代码,在生成第三个表后,将活动表设置为第一个工作表。这确实解决了分组问题,但它取消了第一个工作表中的任何行或列大小,我无法将其拿回来。
我的密码在下面。如果有人能帮忙,我会非常感激的!
<cfscript>
/* Format for data rows */
dataFormat = StructNew();
dataFormat.font="Arial";
dataFormat.fontsize="10";
dataFormat.italic="false";
dataFormat.bold="false";
dataFormat.alignment="left";
dataFormat.textwrap="true";
dataFormat.fgcolor="white";
dataFormat.bottomborder="thin";
dataFormat.bottombordercolor="black";
dataFormat.topbordercolor="black";
dataFormat.topborder="thin";
dataFormat.leftborder="thin";
dataFormat.leftbordercolor="black";
dataFormat.rightborder="thin";
dataFormat.rightbordercolor="black";
dataFormat.locked = "true";
//dataFormat.dataformat="@";
spreadsheetVar= spreadSheetNew("New", "true");
spreadsheetSetCellValue(spreadsheetVar, "123", 1, 1);
spreadsheetSetCellValue(spreadsheetVar, "This is some medium length text.", 1, 2);
spreadsheetSetCellValue(spreadsheetVar, "Here is longer text that will need to wrap once I am done.", 1, 3);
spreadsheetSetCellValue(spreadsheetVar, "This is a very short amount of text.", 1, 4);
spreadsheetSetCellValue(spreadsheetVar, "And here is the final column that needs to be formatted.", 1, 5);
spreadsheetFormatRow(spreadsheetVar, dataFormat, 1);
spreadsheetSetColumnWidth(spreadsheetVar, 1, 30);
spreadsheetCreateSheet(spreadsheetVar,"A");
spreadsheetSetActiveSheet(spreadsheetVar,"A");
spreadsheetSetCellValue(spreadsheetVar, "Sheet A test", 1, 1);
spreadsheetCreateSheet(spreadsheetVar,"B");
spreadsheetSetActiveSheet(spreadsheetVar,"B");
spreadsheetSetCellValue(spreadsheetVar, "Sheet B test", 1, 1);
//This line gets rid of the grouping, but destroys the formatting for the sheet "New". To see the grouping, comment it out.
spreadsheetSetActiveSheet(spreadsheetVar, "New");
</cfscript>
<cfspreadsheet action="write" filename="c:/mySpreadSheet.xlsx" name="spreadsheetVar" overwrite="true" > 发布于 2014-09-04 21:17:25
我不确定CF还是POI最终是错误的,但问题围绕着两个Excel概念之间的差异: active和selected。
选择允许您一次操作一个或多个工作表。因此,可以将多个工作表标记为选定的。另一方面,Active则大致类似于具有“焦点”的工作表。因此,很明显,在任何给定的时间,只有单个工作表可以被标记为活动的。
代码中发生的情况是CF将第三个工作表标记为active。然而,在幕后,它也将第一张纸标记为选定的。因此,当打开工作簿时,两个工作表都在发挥作用。这就是为什么Excel将它们作为分组处理。。
// display "active" and "selected" sheets
wb = spreadsheetVar.getWorkBook();
writeOutput("active sheet ="& wb.getActiveSheetIndex());
for (i = 0; i < wb.getNumberOfSheets(); i++) {
writeOutput("<br>["& i &"] selected = "& wb.getSheetAt(i).isSelected());
}我在CF10下运行了您的代码,重新设置active sheet似乎解决了问题。(列宽不受影响)。由于CF9的行为听起来是不同的,您可能需要使用底层的POI库来解决这个问题。尝试将POI用于更改活动工作表,而不是CF函数:
// note: sheet indexes are zero based
spreadsheetVar.getWorkBook().setActiveSheet(0)在内部,这是SpreadsheetSetActiveSheet无论如何都使用的方法。但是,我怀疑CF函数也执行一些其他操作。这些“其他”操作可能是导致列宽度丢失的原因。直接调用底层方法可以避免这些负面副作用。
https://stackoverflow.com/questions/25651837
复制相似问题