我无法弄清楚发生了什么。我使用cfspreadsheet从简单的选择查询将数据从Oracle 12c db导出到Excel:
<cfset var_filenameis = "report.xlsx">
<cfset SpreadsheetObj = spreadsheetNew("true")>
<cfset SpreadsheetObj = spreadsheetNew("#var_filenameis#","yes")>
<cfspreadsheet action="write" filename="#var_filenameis#" query="get_data" overwrite="true">
<cflocation url = "#var_filenameis#">
一列数据包含各种格式的目录号。其中一些在导出到xlsx时会被截断。例如,02923F变为2923,08552D变为8552.但是,08566A保持08566A,02584C也保持不变。在浏览器中查看时,数据显示正确。从DB直接导出也显示正确的数据。我能理解领先的0消失,但不是信。
我已经在数据库中重新输入了问题目录号,以确保没有多余的字符,但无济于事。如果我在目录号前面添加单引号,则显示正确,但我不能在输出中显示单引号。
我用CF9和CF11得到了相同的结果。我甚至无法判断cfspreadsheet或xlxs是否存在问题。有什么好主意吗?谢谢!
答案 0 :(得分:0)
(评论太长)
如果您使用的是CF11,请尝试使用SpreadSheetAddRows代替cfspreadsheet
。它更聪明一些,它使用查询列的数据类型来确定正确的单元格类型。只要查询列是某种VARCHAR,就会保留字符串值。
<!--- sample data --->
<cfset qData = queryNew("")>
<cfset queryAddColumn(qData, "StringValue", "varchar", ["02923F","08552D","08566A","02584C"])>
<!--- populate sheet --->
<cfset sheet = SpreadsheetNew("Sheet1", true)>
<cfset spreadSheetAddRows(sheet, qData)>
<!--- display results --->
<cfheader name="Content-Disposition" value="attachment;filename=testFile.xlsx">
<cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" variable="#SpreadSheetReadBinary(sheet)#">
我无法弄清楚发生了什么
这是因为POI(或可能是CF)将“F”和“D”解释为special literals,表示值是浮点数:
浮点文字
浮点字面值的类型为float,如果它以字母
F
结尾 或f
;否则它的类型是双倍的,它可以选择以 字母D
或d
。
因此您的字符串正在转换为数字。这就是为什么前导零和尾随“F”或“D”消失的原因。