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

Ste*_*her 5 sql coldfusion excel coldfusion-9

我正在编写一个脚本来将大型excel spreadhseet导入SQL Server 2008数据库.一切都很好,除了一个小细节:

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

我搜索了谷歌和S/O的答案,但我没有遇到这种特殊情况的解决方案.这是我正在使用的电子表格功能的链接.

我无法向您展示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>
Run Code Online (Sandbox Code Playgroud)

编辑:我无法显示我正在使用的Excel工作表,但我重新创建了列表,因此您知道我正在谈论的是什么类型的下拉单元格.注意:我正在使用的工作表,选项列表不是使用单元格构建的,创建者在验证子句中使用了静态值!

http://oi41.tinypic.com/30svhuw.jpg

Lei*_*igh 3

我终于有机会对此进行测试,POI 列表中的线索非常准确。只需读入文件,提取底层 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>
Run Code Online (Sandbox Code Playgroud)