使用Apache POI在Microsoft Excel XSSF中存储电话号码

时间:2013-10-08 05:45:49

标签: java excel excel-vba apache-poi openxml vba

我有一个电话号码存储在Excel中作为字符串,Excel文件创建成功,数据没有错误,但每个电话号码旁边都有一个“数字存储为文本”错误。

我在网上看过,我应该使用excel附带的特殊电话号码格式或自定义的000-000-0000格式。我可以使用excel程序设置这些,但不能使用我的Java代码。


我已经四处查看有关setCellType和DataFormat的信息,但我认为CellType必须是String,我不知道如何将DataFormat用于除日期之外的任何内容。

我也看过DataFormatter,但我不明白如何使用它来存储数据。看起来它只是为了帮助阅读数据。 http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/DataFormatter.html


如何执行以下任一操作?

1)将单元格标记为“忽略错误”,忽略“存储为文本的数字”错误
2)利用内置的Excel格式“特殊>电话号码”

1)看起来有一个标志在保存和关闭文件时仍然存在,我不知道如何使用POI编辑或查看它。有一篇关于它的帖子:

  

excel文档的第669页和第670页涵盖了举行的FeatFormulaErr2   在FeatRecord共享功能,理论上允许您存储   对于单元格范围,应忽略“作为文本的数字”

     

我们还有两个测试文件,一个带有警告,另一个带有警告   off - 46136-NoWarnings.xls和46136-WithWarnings.xls。我没有创造   但是他们!

     

尼克   http://mail-archives.apache.org/mod_mbox/poi-user/201003.mbox/%3C27823222.post@talk.nabble.com%3E

看来这可以在cell.Errors.Item(xlNumberAsText).Ignore = True的VBA中完成,但似乎没有POI的等价物

4 个答案:

答案 0 :(得分:2)

我已经想出如何实现#2)利用内置的Excel格式“特殊>电话号码”

Excel中的电话号码存储为CELL_TYPE_NUMERIC,而不是CELL_TYPE_STRING

try {
    row.createCell(0).setCellValue(Long.parseLong(aNumericOnlyPhoneNumberString));
} catch (NumberFormatException e) {
    row.createCell(0);
}
CellStyle phoneNumberStyle = wb.createCellStyle();
phoneNumberStyle.setDataFormat(wb.createDataFormat().getFormat("(000) 000-0000"));
row.getCell(0).setCellStyle(phoneNumberStyle);

答案 1 :(得分:0)

在写入excel之前,我不确定您是否正在进行数据类型转换。也许你可以使用这样的东西:

if(cellData.getCellType() == 1)
    cell.setCellValue((String)cellData.getData());
else if(cellData.getCellType() == 0)
    cell.setCellValue(((Integer)cellData.getData()).intValue());

答案 2 :(得分:-1)

嘿尝试下面给出的代码 -

@Test
public void writeToExcel() {
    //Blank workbook
    XSSFWorkbook workbook = new XSSFWorkbook(); 

    //Create a blank sheet
    XSSFSheet sheet = workbook.createSheet("Employee Data");

    //This data needs to be written (Object[])
    Map<String, Object[]> data = new TreeMap<String, Object[]>();
    data.put("1", new Object[] {"ID", "NAME", "PHONE"});
    data.put("2", new Object[] {1, "Amit", "9865321425"});
    data.put("3", new Object[] {2, "Lokesh","9562264578"});
    data.put("4", new Object[] {3, "John", "9458262145"});


    //Iterate over data and write to sheet
    Set<String> keyset = data.keySet();
    int rownum = 0;
    for (String key : keyset)
    {
        Row row = sheet.createRow(rownum++);
        Object [] objArr = data.get(key);
        int cellnum = 0;
        for (Object obj : objArr)
        {
           Cell cell = row.createCell(cellnum++);
           if(obj instanceof String)
                cell.setCellValue((String)obj);
            else if(obj instanceof Integer)
                cell.setCellValue((Integer)obj);
        }
    }
    try
    {
        //Write the workbook in file system
        FileOutputStream out = new FileOutputStream(new File("D:/writeTest.xlsx"));
        workbook.write(out);
        out.close();
        System.out.println("writeTest.xlsx written successfully on disk.");
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}

默认情况下,excel的单元格类型为String。如果要以数字格式存储电话号码,则必须将单元格类型设置为数字。

           if(obj instanceof String)
                cell.setCellValue((String)obj);
            else if(obj instanceof Integer){
               // set cell format to numeric
                cell.setCellType(Cell.CELL_TYPE_NUMERIC);
                cell.setCellValue((Integer)obj);
            }

在阅读excel文件时,请记住您正在阅读的一类是字符串类型的单元格数据或数字类型的单元格数据。

要读取字符串类型单元格数据,请使用代码 -

cell.getStringCellValue();

并读取数字单元格类型数据 -

cell.getNumericCellValue();

答案 3 :(得分:-1)

完美地尝试这项工作。 这是读取excel xlsx格式的函数,并将所有数据存储在数组列表中。

     public ArrayList Xreadexcel(String file) {        
    boolean f = false;
    ArrayList arraycontainer = new ArrayList();
    try {
        FileInputStream myInput = new FileInputStream(file);
        XSSFWorkbook workbook = new XSSFWorkbook(file);
        XSSFSheet sheet = workbook.getSheetAt(0);
        int rowStart = sheet.getFirstRowNum();
        int rowEnd = sheet.getLastRowNum() + 1;
        int count = workbook.getNumberOfSheets();
        if (count > 1) {
            System.out.println("Only one Sheet Allowed");
        } else {
            for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
                Row row = sheet.getRow(rowNum);
                int lastColumn = row.getLastCellNum();
                ArrayList arraylist = new ArrayList();
                int cn = 0;
                for (cn = 0; cn < lastColumn + 1; cn++) {
                    Cell cell = row.getCell(cn, Row.RETURN_NULL_AND_BLANK);
                    if ((cell == null) || (cell.equals("")) || (cell.getCellType() == cell.CELL_TYPE_BLANK)) {
                        arraylist.add("");
                    } else {
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        arraylist.add(cell);
                    }
                }
                arraycontainer.add(arraylist);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return arraycontainer;
}