Excel工作表分组和格式

时间:2014-09-03 19:03:33

标签: excel coldfusion coldfusion-9

我已多次在这里寻找答案,但这是我第一次提出自己的问题。我对4-10版本有大约15年的Cf经验,所以,虽然我不是专家,但我知道我对大多数事情做了什么。

我目前有一个项目,我从另一个开发人员接管。部分应用程序将数据从SQL Server 2008数据库输出到具有三个工作表或选项卡的Excel文件,这三个工作表或选项卡按顺序从左到右创建。我正在努力解决一个问题,当打开Excel文件时,第一张和第三张是"分组"。在标题栏中的文件名旁边,显示[组],两张表似乎都处于活动状态。这样做的问题在于,如果用户要突出显示工作表3中的第5行,则第5行也会在工作表1中突出显示。我已经搜索到了我能想到的每个搜索字符串,无法找到什么!我甚至尝试根据CF文档重新创建功能的骨架,并遇到了同样的问题。我自己想出了一些东西。

首先,中间纸张完全不受影响。其次,一旦在Excel中,如果你选择中间工作表,其他一切都会得到修复(当然,这对最终用户来说不是一个很好的解决方案)。第三,如果我使用" xmlformat"创建电子表格。等于"假"并将其输出为" 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" > 

1 个答案:

答案 0 :(得分:3)

我不确定CF或POI是否最终有问题,但问题围绕两个Excel概念之间的区别:活动选择表。

选择允许您一次操作一张或多张纸。因此,可以将多个工作表标记为 selected 。另一方面,主动类似于具有“焦点”的纸张。因此,显然在任何给定时间只能将一张纸标记为活动

您的代码中发生的事情是CF将第三张标记为活动。但是,在幕后,它还将第一张纸标记为选择。结果,在打开工作簿时,两个工作表都在播放。这就是为什么Excel treats them as grouped

    // 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到change the active sheet,而不是CF函数:

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

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