]> source.dussan.org Git - poi.git/commitdiff
sync table headers with worksheet on save
authorYegor Kozlov <yegor@apache.org>
Sun, 2 Dec 2012 12:28:32 +0000 (12:28 +0000)
committerYegor Kozlov <yegor@apache.org>
Sun, 2 Dec 2012 12:28:32 +0000 (12:28 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1416166 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFTable.java

index 851aeaa3ae5e5e1a835b913cefdde6c753977497..4f71c2d8cece550ad13242ee414829a9bb86f201 100644 (file)
@@ -47,7 +47,7 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.TableDocument;
  * @author Roberto Manicardi
  */
 public class XSSFTable extends POIXMLDocumentPart {
-       
+
        private CTTable ctTable;
        private List<XSSFXmlColumnPr> xmlColumnPr;
        private CellReference startCellReference;
@@ -81,7 +81,9 @@ public class XSSFTable extends POIXMLDocumentPart {
        }
 
        public void writeTo(OutputStream out) throws IOException {
-               TableDocument doc = TableDocument.Factory.newInstance();
+        updateHeaders();
+
+        TableDocument doc = TableDocument.Factory.newInstance();
                doc.setTable(ctTable);
                doc.save(out, DEFAULT_XML_OPTIONS);
        }
@@ -234,9 +236,11 @@ public class XSSFTable extends POIXMLDocumentPart {
                
                if(startCellReference==null){                   
                                String ref = ctTable.getRef();
-                               String[] boundaries = ref.split(":");
-                               String from = boundaries[0];
-                               startCellReference = new CellReference(from);
+                if(ref != null) {
+                    String[] boundaries = ref.split(":");
+                    String from = boundaries[0];
+                    startCellReference = new CellReference(from);
+                }
                }
                return startCellReference;
        }
@@ -275,4 +279,28 @@ public class XSSFTable extends POIXMLDocumentPart {
                }
                return rowCount;
        }
+
+    /**
+     * Synchronize table headers with cell values in the parent sheet.
+     * Headers <em>must</em> be in sync, otherwise Excel will display a
+     * "Found unreadable content" message on startup.
+     */
+    public void updateHeaders(){
+        XSSFSheet sheet = (XSSFSheet)getParent();
+        CellReference ref = getStartCellReference();
+        if(ref == null) return;
+
+        int headerRow = ref.getRow();
+        int firstHeaderColumn = ref.getCol();
+        XSSFRow row = sheet.getRow(headerRow);
+
+        if(row != null) for(CTTableColumn col : getCTTable().getTableColumns().getTableColumnList()){
+            int colIdx = (int)col.getId() - 1 + firstHeaderColumn;
+            XSSFCell cell = row.getCell(colIdx);
+            if(cell != null) {
+                col.setName(cell.getStringCellValue());
+            }
+        }
+
+    }
 }