簡體   English   中英

使用Apache POI在Microsoft Excel XSSF中存儲電話號碼

[英]Storing Phone Numbers in Microsoft Excel XSSF using Apache POI

我有一個電話號碼存儲在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單元格格式“Special> Phone Number”

1)看起來有一個標志通過保存和關閉文件持續存在,我不知道如何使用POI編輯或查看它。 有一篇關於它的帖子:

excel文檔的第669頁和第670頁涵蓋了FeatFormulaErr2,它在FeatRecord共享功能中保存,理論上允許您存儲“單元格作為文本”應被忽略的事實

我們還有兩個測試文件,一個帶有警告,另一個帶有它們 - 46136-NoWarnings.xls和46136-WithWarnings.xls。 然而,我並沒有創造它們!

Nick 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的等價物

我已經想出如何實現#2)利用內置的Excel單元格格式“Special> Phone Number”

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);

在寫入excel之前,我不確定您是否正在進行數據類型轉換。 也許你可以使用這樣的東西:

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

嘿試試下面給出的代碼 -

@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();

嘗試這完美的工作。 這是讀取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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM