BAEL-3656 Read Numeric Strings in Excel Cells as a String with Apache POI

This commit is contained in:
Gang 2020-01-01 21:34:48 -07:00
parent 0846a55404
commit 7de715c611
3 changed files with 149 additions and 1 deletions

View File

@ -32,7 +32,7 @@
</dependencies>
<properties>
<poi.version>3.15</poi.version>
<poi.version>4.1.1</poi.version>
<jexcel.version>1.0.6</jexcel.version>
</properties>

View File

@ -0,0 +1,20 @@
package com.baeldung.poi.excel;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Workbook;
public class ExcelCellFormatter {
public String getCellStringValue(Cell cell) {
DataFormatter formatter = new DataFormatter();
return formatter.formatCellValue(cell);
}
public String getCellStringValueWithFormula(Cell cell, Workbook workbook) {
DataFormatter formatter = new DataFormatter();
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
return formatter.formatCellValue(cell, evaluator);
}
}

View File

@ -0,0 +1,128 @@
package com.baeldung.poi.excel;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class ExcelCellFormatterIntegrationTest {
private static int STRING_CELL_INDEX = 0;
private static int BOOLEAN_CELL_INDEX = 1;
private static int RAW_NUMERIC_CELL_INDEX = 2;
private static int FORMATTED_NUMERIC_CELL_INDEX = 3;
private static int FORMULA_CELL_INDEX = 4;
private String fileLocation;
@Before
public void generateExcelFile() throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Test");
Row row = sheet.createRow(0);
Cell cell = row.createCell(STRING_CELL_INDEX);
cell.setCellValue("String Test"); // STRING cell
cell = row.createCell(BOOLEAN_CELL_INDEX);
cell.setCellValue(true); // BOOLEAN cell
cell = row.createCell(RAW_NUMERIC_CELL_INDEX);
cell.setCellValue(1234.5678); // NUMERIC cell
cell = row.createCell(FORMATTED_NUMERIC_CELL_INDEX);
cell.setCellValue(1234.5678);
CellStyle curStyle = workbook.createCellStyle();
DataFormat df = workbook.createDataFormat();
curStyle.setDataFormat(df.getFormat("$#,##0.00"));
cell.setCellStyle(curStyle); // NUMERIC cell with format rule
cell = row.createCell(FORMULA_CELL_INDEX);
cell.setCellFormula("SUM(C1:D1)"); // FORMULA cell
File tempFile = File.createTempFile("ExcelCellFormatterIntegrationTest", ".xlsx");
fileLocation = tempFile.getAbsolutePath();
FileOutputStream outputStream = new FileOutputStream(fileLocation);
workbook.write(outputStream);
workbook.close();
outputStream.close();
}
@Test
public void gvieStringCell_whenGetCellStringValue_thenReturnStringValue() throws IOException {
Workbook workbook = new XSSFWorkbook(fileLocation);
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
ExcelCellFormatter formatter = new ExcelCellFormatter();
assertEquals("String Test", formatter.getCellStringValue(row.getCell(STRING_CELL_INDEX)));
workbook.close();
}
@Test
public void gvieBooleanCell_whenGetCellStringValue_thenReturnBooleanStringValue() throws IOException {
Workbook workbook = new XSSFWorkbook(fileLocation);
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
ExcelCellFormatter formatter = new ExcelCellFormatter();
assertEquals("TRUE", formatter.getCellStringValue(row.getCell(BOOLEAN_CELL_INDEX)));
workbook.close();
}
@Test
public void gvieNumericCell_whenGetCellStringValue_thenReturnNumericStringValue() throws IOException {
Workbook workbook = new XSSFWorkbook(fileLocation);
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
ExcelCellFormatter formatter = new ExcelCellFormatter();
assertEquals("1234.5678", formatter.getCellStringValue(row.getCell(RAW_NUMERIC_CELL_INDEX)));
assertEquals("$1,234.57", formatter.getCellStringValue(row.getCell(FORMATTED_NUMERIC_CELL_INDEX)));
workbook.close();
}
@Test
public void gvieFormualCell_whenGetCellStringValue_thenReturnOriginalFormulaString() throws IOException {
Workbook workbook = new XSSFWorkbook(fileLocation);
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
ExcelCellFormatter formatter = new ExcelCellFormatter();
assertEquals("SUM(C1:D1)", formatter.getCellStringValue(row.getCell(FORMULA_CELL_INDEX)));
workbook.close();
}
@Test
public void gvieFormualCell_whenGetCellStringValueForFormula_thenReturnOriginalFormulatring() throws IOException {
Workbook workbook = new XSSFWorkbook(fileLocation);
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
ExcelCellFormatter formatter = new ExcelCellFormatter();
assertEquals("2469.1356", formatter.getCellStringValueWithFormula(row.getCell(FORMULA_CELL_INDEX), workbook));
workbook.close();
}
@After
public void cleanup() {
File testFile = new File(fileLocation);
if (testFile.exists()) {
testFile.deleteOnExit();
}
}
}