Excel 两位数年份
在ColdFusion 11中,我使用cfSpreadsheet将.xls文件转换为查询对象。以下是我的演示电子表格的屏幕截图: 我使用以下代码在创建查询对象后立即查看它:Excel 两位数年份,excel,coldfusion,coldfusion-11,cfspreadsheet,Excel,Coldfusion,Coldfusion 11,Cfspreadsheet,在ColdFusion 11中,我使用cfSpreadsheet将.xls文件转换为查询对象。以下是我的演示电子表格的屏幕截图: 我使用以下代码在创建查询对象后立即查看它: <cfspreadsheet action="read" src="demo_spreadsheet.xls" excludeHeaderRow="true" headerrow="1" query="demo_query"/> <cfdump var="#demo_que
<cfspreadsheet action="read" src="demo_spreadsheet.xls"
excludeHeaderRow="true"
headerrow="1" query="demo_query"/>
<cfdump var="#demo_query#">
。。。我得到了这些结果:
请注意,电子表格中所有4位数的年份现在都是2位数的年份?当我使用以下代码输出查询对象中的数据时:
<ul>
<cfoutput query="demo_query">
<li>#name# - #dateformat(start_date, 'medium')#</li>
</cfoutput>
</ul>
- #名称#-#日期格式(开始日期,“中”)#
。。。我得到以下输出(好的,我是新来的,所以我不能发布两个以上的屏幕截图,所以你必须相信我的复制/粘贴):
- 阿尔法-2007年1月1日
- 布拉沃-1972年2月2日
- 查理-2017年3月3日
- 德尔塔-1984年4月4日
- 回声-2029年12月31日
- 狐步舞-1930年1月1日
- 高尔夫-1930年1月1日
欢迎提供任何建议。您的电子表格单元格很可能正在使用内置的,这意味着显示的值(或在本例中为“读取”)可能会因使用的环境或客户端而异 以星号(*)开头的日期和时间格式响应 中指定的区域日期和时间设置的更改 控制面板不带星号的格式不受控件的影响 面板设置 这似乎就是CFS电子表格所发生的事情。不清楚为什么Excel显示格式为
*m/d/yy
的年份是四位数,而不是两位数。但是,CF/POI根据Excel规范返回正确的结果。请注意,如果您将单元格格式切换为非区域性的四位数年份,即m/d/yyyy
,则输出符合您的预期:
更新:至于为什么CF代码显示的年份与您预期的不同,这是因为CF处理的日期字符串不明确。需要注意的是,CFSpreadsheet返回的查询包含字符串,而不是日期对象。当您将这些字符串传递到DateFormat
中时,CF必须首先解释这些字符串并将其转换为日期对象,然后才能应用日期掩码,两位数年份解释如下:
包含日期/时间值的字符串,该值的格式符合美国标准。
区域设置约定。可以表示100 AD–9999范围内的日期/时间
公元0-29年被解释为2000-2029年;30-99岁是
解释为1930-1999年
老实说,CFSpreadsheet的设计目的是提供一种简单的方式来阅读和编写电子表格,而无需大量繁琐的工作。另外,它不支持更改单元格值的解释方式。如果要强制使用四位数年份,则必须手动或通过编程将电子表格更改为使用非区域日期格式(即使用CF读取电子表格,并应用新的单元格格式)。这可能是最简单的选择
如果您希望在代码方面具有更大的灵活性,还可以使用而不是cfspreadsheet。虽然在这种情况下,我认为它们也缺乏必要的功能。因此,您可以考虑使用底层POI库和一些java代码。演示如何获取有关电子表格单元格和值的各种详细信息。可以很容易地对其进行修改,以构建您自己的查询或包含值、格式等的结构数组:
代码:
<cfscript>
// get the sheet you want to read
cfSheet = SpreadSheetRead("c:/temp/demo_spreadsheet.xls");
workbook = cfSheet.getWorkBook();
sheetIndex = workbook.getActiveSheetIndex();
sheet = workbook.getSheetAt( sheetIndex );
// utility used to distinguish between dates and numbers
dateUtil = createObject("java", "org.apache.poi.ss.usermodel.DateUtil");
// process the rows and columns
rows = sheet.rowIterator();
while (rows.hasNext()) {
currentRow = rows.next();
data = {};
cells = currentRow.cellIterator();
while (cells.hasNext()) {
currentCell = cells.next();
col = {};
col.value = "";
col.type = "";
col.column = currentCell.getColumnIndex()+ 1;
col.row = currentCell.getRowIndex()+ 1;
col.format = currentCell.getCellStyle().getDataFormatString();
if (currentCell.getCellType() EQ currentCell.CELL_TYPE_STRING) {
col.value = currentCell.getRichStringCellValue().getString();
col.type = "string";
}
else if (currentCell.getCellType() EQ currentCell.CELL_TYPE_NUMERIC) {
if (DateUtil.isCellDateFormatted(currentCell)) {
col.value = currentCell.getDateCellValue();
col.type = "date";
}
else {
col.value = currentCell.getNumericCellValue();
col.type = "number";
}
}
else if (currentCell.getCellType() EQ currentCell.CELL_TYPE_BOOLEAN) {
col.value = currentCell.getBooleanCellValue();
col.type = "boolean";
}
// ... handle other types CELL_TYPE_BLANK, CELL_TYPE_ERROR, CELL_TYPE_FORMULA
data["COL"& col.column] = col;
}
// this row is finished. display all values
WriteDump(data);
}
</cfscript>
//拿到你想看的那张纸
cfSheet=SpreadSheetRead(“c:/temp/demo_spreadsheet.xls”);
工作簿=cfSheet.get工作簿();
sheetIndex=workbook.getActiveSheetIndex();
sheet=工作簿.getSheetAt(sheetIndex);
//用于区分日期和数字的实用程序
dateUtil=createObject(“java”,“org.apache.poi.ss.usermodel.dateUtil”);
//处理行和列
rows=sheet.rowditerator();
while(rows.hasNext()){
currentRow=rows.next();
数据={};
cells=currentRow.cellIterator();
而(cells.hasNext()){
currentCell=cells.next();
col={};
col.value=“”;
col.type=“”;
col.column=currentCell.getColumnIndex()+1;
col.row=currentCell.getRowIndex()+1;
col.format=currentCell.getCellStyle().getDataFormatString();
if(currentCell.getCellType()等式currentCell.CELL\u类型\u字符串){
col.value=currentCell.getRichStringCellValue().getString();
col.type=“字符串”;
}
else if(currentCell.getCellType()EQ currentCell.CELL\u TYPE\u NUMERIC){
if(DateUtil.isCellDateFormatted(currentCell)){
col.value=currentCell.getDateCellValue();
col.type=“日期”;
}
否则{
col.value=currentCell.getNumericCellValue();
col.type=“编号”;
}
}
else if(currentCell.getCellType()EQ currentCell.CELL\u TYPE\u BOOLEAN){
col.value=currentCell.getBooleanCellValue();
col.type=“boolean”;
}
//…处理其他类型单元格类型为空、单元格类型为错误、单元格类型为公式
数据[“列”和列]=列;
}
//此行已完成。显示所有值
写操作(数据);
}
在版本9上,我得到了不同的结果。对于m/d/yyyy格式的字符串,未更改任何内容。yyyy-mm-dd格式的字符串已根据您的问题更改。这可能与运行ColdFusion的计算机和/或生成电子表格的计算机上的区域设置有关。在源电子表格中,是否实际输入了日期