当前位置: 首页 > 知识库问答 >
问题:

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

于捷
2023-03-14

我有一个以字符串形式存储在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/<27823222.post@talk.nabble.com>

看来这可以使用单元格在 VBA 中完成。Errors.Item(xlNumberAsText).忽略 = 真,但似乎没有 POI 的等效项

共有3个答案

霍弘厚
2023-03-14

嘿,试试下面给出的代码-

@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文件时,请记住一件事,即您正在读取字符串类型的单元格数据或数字类型的单元格。

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

cell.getStringCellValue();

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

cell.getNumericCellValue();
张丁雷
2023-03-14

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

if(cellData.getCellType() == 1)
    cell.setCellValue((String)cellData.getData());
else if(cellData.getCellType() == 0)
    cell.setCellValue(((Integer)cellData.getData()).intValue());
戴原
2023-03-14

我已经想出了如何实现#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);
 类似资料:
  • 错误1264(22003):超出第1行“phone”列的范围值 为什么在错误…手机大小100但为什么超出范围…

  • 我想从用户的电话通讯录中导入所有的联系人号码,并将其存储在数据库中,但由于我想稍后对其进行一些处理,所有的电话号码都应该具有统一的格式。 我在互联网上做了一些研究,发现电话号码有三种主要格式:(来源: googlei18n/libphonenumber) 国际 然后我导出并提取我的电话联系号码,但我知道有很多来自不同国家和运营商的不同格式的号码。 这里有一些例子: 基于谷歌的图书馆,如果你想把任何

  • 问题内容: 这个问题已经在这里有了答案 : 8年前关闭。 可能重复: telefne号和地址的mysql数据类型 关于将电话号码存储在数据库中的最佳做法有何建议?考虑一个美国电话号码: 555 555 1212 555-555-1212 (555)555 1212 5555551212 1-555-555-1212 1(555)555-1212 等等 … 我应该删除格式并仅存储数字吗?我应该只使用

  • 这是使用com.android.support:appcompat-v7:22.2.0 删除autoLink参数将不会发生冲突。 有办法解决吗?

  • 问题内容: 我这样存储电话号码: 用户将输入电话号码,而我将使用该电话号码。此应用程序将在全球范围内使用。因此,我还需要国家代码。是存储电话号码的好方法吗?而且,我该如何验证电话号码? 问题答案: 你实际上可能会研究国际标准格式E.164,例如Twilio推荐的格式(该服务具有通过REST请求发送SMS或电话的服务和API)。 这可能是最普遍的电话号码存储方式,尤其是在你使用国际号码的情况下。 1

  • 问题内容: 我在某些网站上找到了此代码,并且效果很好。它验证电话号码是以下格式之一: (123)456-7890 或 123-456-7890 问题是我的客户(我不知道为什么,也许是客户的东西)想添加另一种格式,即连续十个数字,如下所示: 1234567890 。 我正在使用这个正则表达式, 如何添加它还可以验证另一种格式?我对正则表达式不好。 问题答案: 首先,您的格式验证器显然仅适用于NANP