这段代码我写的是为了在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);
答案 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));