Excel 两位数年份

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

在ColdFusion 11中,我使用cfSpreadsheet将.xls文件转换为查询对象。以下是我的演示电子表格的屏幕截图:

我使用以下代码在创建查询对象后立即查看它:

<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日
1907年现在是2007年,1917年现在是2017年,1929年现在是2029年,2030年现在是1930年。似乎1930年1月1日之前的任何日期的年份都被解读为20xx,2029年12月31日之后的年份被解读为19xx

我错过什么了吗?我以为我们用Y2K解决了这类问题。是否有一个简单的设置,我有不正确的地方?我已经用谷歌搜索了这个问题,但我找不到任何关于它的信息


欢迎提供任何建议。

您的电子表格单元格很可能正在使用内置的,这意味着显示的值(或在本例中为“读取”)可能会因使用的环境或客户端而异

以星号(*)开头的日期和时间格式响应 中指定的区域日期和时间设置的更改 控制面板不带星号的格式不受控件的影响 面板设置

这似乎就是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的计算机和/或生成电子表格的计算机上的区域设置有关。在源电子表格中,是否实际输入了日期