5

我有一个电话号码作为字符串存储在 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 共享功能中,理论上允许您存储这样一个事实:单元格范围应忽略“数字作为文本”

我们还有两个测试文件,一个打开警告,一个关闭警告 - 46136-NoWarnings.xls 和 46136-WithWarnings.xls。然而,我没有创造它们!

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

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

4

4 回答 4

2

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

Excel 中的电话号码存储CELL_TYPE_NUMERICCELL_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);
于 2013-10-08T07:52:29.893 回答
0

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

if(cellData.getCellType() == 1)
    cell.setCellValue((String)cellData.getData());
else if(cellData.getCellType() == 0)
    cell.setCellValue(((Integer)cellData.getData()).intValue());
于 2013-10-08T05:58:50.557 回答
-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 的单元格类型是字符串。如果要以数字格式存储电话号码,则必须将单元格类型设置为数字。

           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();
于 2013-10-08T06:25:07.990 回答
-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;
}
于 2014-11-06T11:52:33.847 回答