_row = row;
if (cell.getR() != null) {
_cellNum = new CellReference(cell.getR()).getCol();
+ } else {
+ int prevNum = row.getLastCellNum();
+ if(prevNum != -1){
+ _cellNum = row.getCell(prevNum-1).getColumnIndex() + 1;
+ }
}
_sharedStringSource = row.getSheet().getWorkbook().getSharedStringSource();
_stylesSource = row.getSheet().getWorkbook().getStylesSource();
* @return A1 style reference to the location of this cell
*/
public String getReference() {
- return _cell.getR();
+ String ref = _cell.getR();
+ if(ref == null) {
+ return new CellReference(this).formatAsString();
+ }
+ return ref;
}
/**
* Sets this cell as the active cell for the worksheet.
*/
public void setAsActiveCell() {
- getSheet().setActiveCell(_cell.getR());
+ getSheet().setActiveCell(getReference());
}
/**
public void removeCellComment() {
XSSFComment comment = getCellComment();
if(comment != null){
- String ref = _cell.getR();
+ String ref = getReference();
XSSFSheet sh = getSheet();
sh.getCommentsTable(false).removeComment(ref);
sh.getVMLDrawing(false).removeCommentShape(getRowIndex(), getColumnIndex());
public CellRangeAddress getArrayFormulaRange() {
XSSFCell cell = getSheet().getFirstCellInArrayFormula(this);
if (cell == null) {
- throw new IllegalStateException("Cell " + _cell.getR()
+ throw new IllegalStateException("Cell " + getReference()
+ " is not part of an array formula.");
}
String formulaRef = cell._cell.getF().getRef();
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
/**
* @author Yegor Kozlov
*/
wb.getCreationHelper().createFormulaEvaluator().evaluateFormulaCell(cell);
assertEquals(36, cell.getErrorCellValue());
}
+
+ public void testMissingRAttribute() {
+ XSSFWorkbook wb = new XSSFWorkbook();
+ XSSFSheet sheet = wb.createSheet();
+ XSSFRow row = sheet.createRow(0);
+ XSSFCell a1 = row.createCell(0);
+ a1.setCellValue("A1");
+ XSSFCell a2 = row.createCell(1);
+ a2.setCellValue("B1");
+ XSSFCell a4 = row.createCell(4);
+ a4.setCellValue("E1");
+ XSSFCell a6 = row.createCell(5);
+ a6.setCellValue("F1");
+
+ assertCellsWithMissingR(row);
+
+ a2.getCTCell().unsetR();
+ a6.getCTCell().unsetR();
+
+ assertCellsWithMissingR(row);
+
+ wb = (XSSFWorkbook)_testDataProvider.writeOutAndReadBack(wb);
+ row = wb.getSheetAt(0).getRow(0);
+ assertCellsWithMissingR(row);
+ }
+
+ private void assertCellsWithMissingR(XSSFRow row){
+ XSSFCell a1 = row.getCell(0);
+ assertNotNull(a1);
+ XSSFCell a2 = row.getCell(1);
+ assertNotNull(a2);
+ XSSFCell a5 = row.getCell(4);
+ assertNotNull(a5);
+ XSSFCell a6 = row.getCell(5);
+ assertNotNull(a6);
+
+ assertEquals(6, row.getLastCellNum());
+ assertEquals(4, row.getPhysicalNumberOfCells());
+
+ assertEquals("A1", a1.getStringCellValue());
+ assertEquals("B1", a2.getStringCellValue());
+ assertEquals("E1", a5.getStringCellValue());
+ assertEquals("F1", a6.getStringCellValue());
+
+ // even if R attribute is not set,
+ // POI is able to re-construct it from column and row indexes
+ assertEquals("A1", a1.getReference());
+ assertEquals("B1", a2.getReference());
+ assertEquals("E1", a5.getReference());
+ assertEquals("F1", a6.getReference());
+ }
+
+ public void testMissingRAttributeBug54288() {
+ // workbook with cells missing the R attribute
+ XSSFWorkbook wb = (XSSFWorkbook)_testDataProvider.openSampleWorkbook("54288.xlsx");
+ // same workbook re-saved in Excel 2010, the R attribute is updated for every cell with the right value.
+ XSSFWorkbook wbRef = (XSSFWorkbook)_testDataProvider.openSampleWorkbook("54288-ref.xlsx");
+
+ XSSFSheet sheet = wb.getSheetAt(0);
+ XSSFSheet sheetRef = wbRef.getSheetAt(0);
+ assertEquals(sheetRef.getPhysicalNumberOfRows(), sheet.getPhysicalNumberOfRows());
+
+ // Test idea: iterate over cells in the reference worksheet, they all have the R attribute set.
+ // For each cell from the reference sheet find the corresponding cell in the problematic file (with missing R)
+ // and assert that POI reads them equally:
+ DataFormatter formater = new DataFormatter();
+ for(Row r : sheetRef){
+ XSSFRow rowRef = (XSSFRow)r;
+ XSSFRow row = sheet.getRow(rowRef.getRowNum());
+
+ assertEquals("number of cells in row["+row.getRowNum()+"]",
+ rowRef.getPhysicalNumberOfCells(), row.getPhysicalNumberOfCells());
+
+ for(Cell c : rowRef){
+ XSSFCell cellRef = (XSSFCell)c;
+ XSSFCell cell = row.getCell(cellRef.getColumnIndex());
+
+ assertEquals(cellRef.getColumnIndex(), cell.getColumnIndex());
+ assertEquals(cellRef.getReference(), cell.getReference());
+
+ if(!cell.getCTCell().isSetR()){
+ assertTrue("R must e set in cellRef", cellRef.getCTCell().isSetR());
+
+ String valRef = formater.formatCellValue(cellRef);
+ String val = formater.formatCellValue(cell);
+ assertEquals(valRef, val);
+ }
+
+ }
+ }
+ }
+
}