Excel工作表分组和格式

我在这里多次search答案,但这是我第一次问自己的问题。 我有4-5年的Cf经验大约15年,所以虽然我不是专家,但是我知道我在做什么。

我目前有一个项目,我从另一个开发人员接pipe。 部分应用程序将数据从SQL Server 2008数据库输出到一个Excel文件,该文件具有三个工作表或选项卡,按顺序从左到右创build。 我正在努力解决打开Excel文件时,第一张和第三张纸是“分组”的问题。 在标题栏中的文件名称旁边,显示[组],并且这两张表看起来都是活动的。 问题在于,如果用户要突出显示表3中的第5行,则第5行也会在表1中突出显示。我已经search到了每个searchstring,我都能想到并找不到任何东西! 我甚至尝试重新创build基于CF文档的function骨架,并遇到同样的问题。 我自己想出了一些东西。

首先,中间的纸张完全不受影响。 其次,一旦在Excel中,如果select中间表单,则其他所有内容都将得到修复(当然,这对于最终用户来说不是一个好的解决scheme)。 第三,如果我用“xmlformat”等于“false”创build电子表格并将其输出为“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" > 

我不确定CF或POI是否最终是错误的,但是这个问题是围绕着两个Excel概念之间的差异而展开的: 活动页面选定页面

select允许您一次操作一个或多个工作表。 因此,多张纸可以被标记为select 。 另一方面,主动类似于具有“焦点”的表单。 所以显然在任何时候只有一张纸可以被标记为活动的

代码中发生的事情是CF将第三个表单标记为活动状态 。 但是在幕后,它也标志着第一张被选中的作品 。 因此,打开工作簿时,两张纸都在播放。 这就是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下运行你的代码,并重置活动表似乎解决了这个问题。 (列宽不受影响)。 由于听起来像CF9行为不同,你可能需要深入到底层的POI库来解决这个问题。 尝试使用POI 更改活动工作表 ,而不是CFfunction:

  // note: sheet indexes are zero based spreadsheetVar.getWorkBook().setActiveSheet(0) 

在内部,这是SpreadsheetSetActiveSheet反正使用的方法。 但是,我怀疑CFfunction也执行一些其他操作。 这些“其他”操作可能是导致列宽丢失的原因。 直接调用底层方法可以避免这些负面影响。