使用ColdFusion在Excel中创建大型下拉列表时出错

时间:2014-02-19 02:58:11

标签: coldfusion

这段代码我写的是为了在ColdFusion中创建大型下拉列表,但它不能用于我的目的。任何人都可以帮我纠正我的问题。新代码是

    <cfquery name="getPOP" datasource="l_webalc">
    select distinct center_code from alc_pop
    </cfquery>
    <cfset countryName= ArrayNew(1)>
      <cfloop query="getPOP">
      <cfset arrayappend(countryName, getPOP.center_code)>
    </cfloop>

    <script>
      workbook = new HSSFWorkbook();
      realSheet = workbook.createSheet("Sheet xls");
      hidden = workbook.createSheet("hidden");

      for (int i = 0, length= countryName.length; i < length; i++) {
        String name = countryName[i];
        HSSFRow row = hidden.createRow(i);
        HSSFCell cell = row.createCell(0);
        cell.setCellValue(name);
      }

      namedCell = workbook.createName();
      namedCell.setNameName("hidden");
      namedCell.setRefersToFormula("hidden!A1:A" + countryName.length);
      constraint = DVConstraint.createFormulaListConstraint("hidden");
      addressList = new CellRangeAddressList(0, 0, 0, 0);
      validation = new HSSFDataValidation(addressList, constraint);
      workbook.setSheetHidden(1, true);
      realSheet.addValidationData(validation);
      stream = new FileOutputStream("c:\\range.xls");
      workbook.write(stream);
      stream.close();
    </script>

更新1:

(来自other thread)我收到此错误消息:

  FUNCTION声明中缺少

函数关键字。 CFML编译器   正在处理:一个以HSSFWorkbook开头的脚本语句   32,第1列。以第31行的函数开头的脚本语句,   第9栏。从第30行第2列开始的cfscript标记。

更新2:

我再次修改了这段代码,现在新的错误是

  

“隐藏的值不是A1:A无法转换为数字。”

我按照评论中的提法编辑了对象,并将脚本更改为cfscript。请帮我纠正这个错误。

<cfscript>
workbook = createObject("java", "org.apache.poi.hssf.usermodel.HSSFWorkbook");
realSheet = workbook.createSheet("Sheet xls");
 hidden = workbook.createSheet("hidden");
 for (i = 1; i <= arrayLen(countryName); i++){
   name = countryName[i];
    row = hidden.createRow(i);
    cell = row.createCell(0);
   cell.setCellValue(name);
 }
 namedCell = workbook.createName();
 namedCell.setNameName("hidden");
 namedCell.setRefersToFormula("hidden!A1:A"+arrayLen(countryName));
 dv = createObject("java", "org.apache.poi.hssf.usermodel.DVConstraint");
 constraint = dv.createFormulaListConstraint("hidden");
 addressList = cellRangeList.init(0, 0, 0, 0);
 validation = dataValidation.init(addressList, constraint);
 workbook.setSheetHidden(1, true);
 realSheet.addValidationData(validation);
  stream = new FileOutputStream("c:\\range.xls");
 workbook.write(stream);
 stream.close();
</cfscript>    

更新3:

我已更新代码以修复上述问题,现在我收到此错误

  

“找不到setSheetHidden方法......”

在以下一行:

workbook.setSheetHidden(1, true); 

2 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。虽然java语法类似,但您不能只复制和粘贴java example并期望它在cfscript中运行。您需要先进行一些调整。 (注意:我假设script只是cfscript)的拼写错误。

  • 在java中,您可以使用关键字“new”即new SomeClassName()来实例化对象。在CF中,new关键字只能与cfc一起使用。要创建java对象,必须使用createObject。要实例化它,请调用init(...)方法。它是special method in CF,它使用您提供的任何参数调用java类的构造函数,即

    createObject("java", "path.to.SomeClassName").init();

    要使用DVConstraint.createFormulaListConstraint()等静态方法,您还必须使用createObject。虽然java代码不会创建该类的new实例,但在调用其任何方法之前,仍必须使用createObject来获取对CF中DVConstraint类的引用。注意:因为它是静态的,所以不需要先调用init()。即

    dv = createObject("java", "org.apache.poi.hssf.usermodel.DVConstraint"); dv.createFormulaListConstraint(...);

  • Java类被组织为packages。在java类中,任何引用类的完整路径都是在java代码的顶部导入的(在您使用的示例中不可见)。在CF中,您需要使用createObject来电中的完整路径。 (重要:路径是cAsE sEnsItIvE)。

    例如,代替new HSSFWorkbook()使用:

    createObject("java", "org.apache.poi.hssf.usermodel.HSSFWorkbook");

    如果您不确定路径,只需搜索“POI TheClassName”即可。赔率是第一个结果POI JavaDocs,它显示每页顶部的完整路径,如下所示:

    java.lang.Object

    |---org.apache.poi.ss.util.CellRangeAddressList

  • 与CF不同,java是强类型的,这意味着您必须声明变量的类型及其名称。例如,此行将变量row声明为类型HSSFRow

    HSSFRow row = hidden.createRow(i);

    由于CF是无类型的,因此不需要类型。因此,在cfscript中运行相同的代码将导致隐藏错误“函数关键字丢失...”。解决方案是删除变量类型,只做一个直接的变量赋值:

    row = hidden.createRow(i);

  • Java array indexes从零(0)开始,而CF从一(1)开始,因此您需要修复for循环中的索引:

    for (i = 1; i <= arrayLen(countryName); i++)

  • Java使用+来连接字符串,而CF使用&。因此,您需要在此处更改运算符"hidden!A1:A" + countryName.length。否则CF会认为你试图添加两个数字,这显然会引发错误,因为第一部分是一个字符串。

假设没有版本冲突,那么在进行那些调整后,java示例应该可以正常工作。

答案 1 :(得分:1)

  

“找不到setSheetHidden方法......”

只需将Javacast函数用于布尔参数:

workbook.setSheetHidden(1, javacast("boolean",true));