我正在编写一个脚本来将大型 Excel 电子表格导入到 SQL Server 2008 数据库中。除了一个小细节之外,一切都工作正常:
如果工作表中的单元格有多个选项(例如 <select>
下拉菜单),则仅抓取选定的选项。我想获取单元格中所有可能的选项,而不仅仅是正在使用的选项(请参阅我的 SQL 查询了解原因)
我已经在 google 和 S/O 中搜索了答案,但没有遇到针对这种特殊情况的解决方案。 Here is a link到我正在使用的电子表格函数。
我无法向您展示 Excel 工作表,但可以安全地假设工作表的遍历是正确的(我已经测试过)。
这是我的代码:
<cfspreadsheet action="read" src="spreadsheet.xlsx" name="sheet">
<cfoutput>
#sheet.rowcount-3#
<cfloop from="2" to="#sheet.rowcount-3#" index="row">
<cfquery datasource="Questions" result="rState">
INSERT INTO States
(
State,
StateAbbr
)
VALUES
(
<cfqueryparam cfsqltype="cf_sql_varchar" value="#SpreadsheetGetCellValue(sheet,row,1)#">,
<cfqueryparam cfsqltype="cf_sql_varchar" value="#SpreadsheetGetCellValue(sheet,row,2)#">
)
</cfquery>
#SpreadsheetGetCellValue(sheet,row,1)#<br />
#SpreadsheetGetCellValue(sheet,row,2)#<br />
<cfloop from="3" to="15" index="col"> <!--- multi row selection (edit based on excel sheet col relationship) --->
<cfif SpreadsheetGetCellValue(sheet,row,col) EQ "">
<cfset SpreadsheetSetCellValue(sheet,"N/A",row,col) />
</cfif>
<cfquery datasource="Questions" result="rResponse">
IF NOT EXISTS
(
SELECT Response
FROM Responses
WHERE Response=<cfqueryparam cfsqltype="cf_sql_nvarchar" value="#SpreadsheetGetCellValue(sheet,row,col)#">
)
INSERT INTO Responses
(
Response
)
VALUES
(
<cfqueryparam cfsqltype="cf_sql_nvarchar" value="#SpreadsheetGetCellValue(sheet,row,col)#">
)
</cfquery>
#row#X#col#<br />
#SpreadsheetGetCellValue(sheet,row,col)#<br />
</cfloop>
</cfloop>
</cfoutput>
编辑:我无法显示我正在使用的 Excel 工作表,但我重新创建了列表,以便您知道我正在谈论哪种下拉单元格。注意:我正在使用的工作表,选项列表不是用单元格构建的,创建者在验证子句中使用了静态值!!!
最佳答案
我终于有机会测试一下了,the thread from the POI list非常准确。只需读入文件,提取底层 POI 表,然后从表对象中获取验证器列表。获得验证器列表后,循环遍历它并提取每个验证器的选项。
每个验证器都包含允许选项的“列表”,以及使用该规则的任何单元格的范围。注意:单元格范围表示为对象,因此您必须进行一些解析才能将它们转换为可用的格式。
此示例返回一个结构数组。每个元素代表一个“LIST”验证器,并包含键:
- list - 包含允许选项的数组:
["dog", "cat", ...]
- cells - 单元格范围数组,即
{ startCell = A1, endCell = A10 }
代码:
<cfscript>
// read in file and grab POI sheet
path = "c:/path/to/file.xlsx";
workbook = spreadSheetRead( path ).getWorkBook();
poiSheet = workbook.getSheet("Sheet1");
// extract all validators and types
results = [];
allRules = poiSheet.getDataValidations();
ruleTypes = createObject("java", "org.apache.poi.ss.usermodel.DataValidationConstraint$ValidationType");
// search all validators for "LIST" type
for (rule in allRules ) {
// determine the rule type
constraint = rule.getValidationConstraint();
type = constraint.getValidationType();
// if "LIST" type, grab the values and cell locations
if (type == ruleTypes.LIST) {
// convert address objects into strings
ranges = [];
addresses = rule.getRegions().getCellRangeAddresses();
for (i = 1; i < arrayLen(addresses); i++) {
// extract start/end cell
addrString = addresses[ i ];
startCell = listFirst( addrString, ":");
endCell = listLast( addrString, ":");
// store results
arrayAppend( ranges, { startCell=startCell, endCell=endCell } );
}
// grab list values
values = constraint.getExplicitListValues();
// store results
arrayAppend( results, { list=values, cells=ranges } );
}
}
// display results
writeDump(results);
</cfscript>
关于sql - 将 Excel 电子表格导入 SQL 数据库 (Coldfusion 9),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18855189/