获取字符串值,当我从Excel中读取日期类型(apache poi)

时间:2013-10-22 18:00:04

标签: java apache-poi simpledateformat xssf

我正在阅读 xlsx文件 - Apache POI库。

例如, 在某些行中,我有这样的单元格值:

01-Sep-13 | 15136.00 |马特| ......


我的目标是: 将行中的所有单元格读取为String值。 但正如我所见,我无法读取 01-Sep-13 作为字符串,  它只代表Date type()with cell.getDateCellValue();


1)我能否以某种方式阅读01-Sep-13字符串:“01-Sep-13”; 2)如果我有不同的日期模式(ddMMyyyy)和(dd-MMM-yy),我可以将Date值转换为字符串;

代码:

当我遍历行和单元格时,Apache POI会分析每个单元格类型:

String normalizeCellType(Cell cell) {

    switch (cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
           return cell.getRichStringCellValue().getString());            
        case Cell.CELL_TYPE_NUMERIC:
            if (DateUtil.isCellDateFormatted(cell)) {

                Date date = cell.getDateCellValue(); ????????????
                System.out.println(date);

            } else {

                ....
            }
            break;
        case Cell.CELL_TYPE_BOOLEAN:
           return ....
        case Cell.CELL_TYPE_FORMULA:
           return ....
        default:
            System.out.println();
    }
}

7 个答案:

答案 0 :(得分:2)

您有两个选择:

  • 使用Java SimpleDateFormat class以您选择的格式将返回的Date格式化为String。您可以为所需的每种格式设置SimpleDateFormat个实例。
  • 使用Apache POI' DataFormatter class直接格式化Cell

答案 1 :(得分:2)

您可以获取单元格#getDateCellValue()的返回值,并使用SimpleDateFormat将其转换为String实例

 // Create an instance of SimpleDateFormat used for formatting 
    // the string representation of date (month/day/year)
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

    // Get the date today using cell.getDateCellValue() 
    Date today = cell.getDateCellValue()       
    // Using DateFormat format method we can create a string 
    // representation of a date with the defined format.
    String reportDate = df.format(today);

您可以以字符串格式获取Date的值 - 2013年10月31日。希望这有帮助

答案 2 :(得分:0)

以下是您的问题答案:

1)我能否以某种方式阅读01-Sep-13字符串:“01-Sep-13”;

是的,你可以。在读取之前,需要将Cell类型设置为String。像这样:

.
.
.
int fcell = row.getFirstCellNum();// first cell number of excel
int lcell = row.getLastCellNum(); //last cell number of excel
while (rows.hasNext()) {
row = (XSSFRow) rows.next();//increment the row iterator
for (int i = fcell; i < lcell; i++) {
    row.getCell(i).setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING);
    .
    .
    ..//processing
    .
    .
    }
}

2.)如果我有不同的日期模式(ddMMyyyy)和(dd-MMM-yy),我可以将Date值转换为字符串;

由于第一个答案已经为您提供了String值。 仍然要将String值转换为日期,您可以使用SimpleDateFormat作为@rgettman和@Keerthi建议

希望这会有所帮助...... :)

答案 3 :(得分:0)

DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
java.util.Date d =  row1.getCell(i).getDateCellValue();
String buy_date = df.format(d);
System.out.println("date is :- "+ buy_date);

输出

date is :- 2014/08/01

现在它将以String格式提供您可以存储在数据库中的日期。

答案 4 :(得分:0)

Apache POI具有为您执行此操作的功能,您只需要调用它!您需要使用的课程是DataFormatter。你传递了一个单元格,它会尽力返回一个字符串,其中包含Excel为该单元格显示的内容。如果你传递一个字符串单元格,你将得到回来的字符串。如果您传递了一个应用了格式规则的数字单元格,它将根据它们格式化数字并返回字符串。如果你传递一个“日期”单元格(带有日期格式规则的数字单元格),它会将其格式化为日期并返回给你的字符串

你可以通过这个往返的代码来看到它的实际效果:

 DataFormat df = workBook.createDataFormat();
 CellStyle dateStyle = wb.createCellStye();
 setDataFormat.setDataFormat(df.getFormat("dd-mmm-yy"));

 Cell cell = row.createCell(0);
 cell.setCellStyle(dateStyle);

 // Set it to be a date
 Calendar c = Calendar.getInstance();
 c.set(2013,9-1,1); // Don't forget months are 0 based on Calendar
 cell.setCellValue( c.getTime() );

 // Get it formatted as a string
 DataFormatter formatter = new DataFormatter();
 String cellAsStr = formatter.formatCellValue(cell);

 // cellAsStr will now be "01-Sep-13"
 // based on the format rules applied to the cell

答案 5 :(得分:0)

我的目标是 :将行中的所有单元格读取为字符串值。但是正如我所看到的,我不能将01-Sep-13作为字符串读取,它只表示类似Date类型()和cell.getDateCellValue();

您可以使用XSSFExcelExtractor或ExcelExtractor来获取格式正确的单元格值。

注意: - 1)XSSFExcelExtractor用于XLSX文件 2)ExcelExtractor用于XLS文件

答案 6 :(得分:0)

使用java在excel表中读取字符串值非常容易。这是我的方式..

var label: UILabel = ...
var text: NSMutableAttributedString = ...
var paragraphStyle: NSMutableParagraphStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle
paragraphStyle.alignment = NSTextAlignment.Justified
paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping
paragraphStyle.baseWritingDirection = NSWritingDirection.RightToLeft
text.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, text.length))
label.attributedText = text