diff --git a/build.xml b/build.xml index 45274b63f..5c7a159c5 100644 --- a/build.xml +++ b/build.xml @@ -151,8 +151,8 @@ under the License. - - + + diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFComment.java b/src/java/org/apache/poi/hssf/usermodel/HSSFComment.java index ed723f3d9..57f18c34d 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFComment.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFComment.java @@ -138,13 +138,6 @@ public class HSSFComment extends HSSFTextbox implements Comment { this.author = author; } - /** - * Fetches the rich text string of the comment - */ - public HSSFRichTextString getString() { - return txo.getStr(); - } - /** * Sets the rich text string used by this comment. * diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index ded600fc3..94b4f536e 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -919,6 +919,13 @@ public class XSSFSheet implements Sheet { } return sheetComments; } + /** + * Returns the sheet's comments object if there is one, + * or null if not + */ + protected CommentsSource getCommentsSourceIfExists() { + return sheetComments; + } /** * Does this sheet have any comments on it? We need to know, diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index cbaa92b8c..e308a7c1a 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -133,6 +133,18 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { public String getContentType() { return TYPE; } public String getRelation() { return REL; } public String getDefaultFileName() { return DEFAULT_NAME; } + + /** + * Returns the filename for the nth one of these, + * eg /xl/comments4.xml + */ + public String getFileName(int index) { + if(DEFAULT_NAME.indexOf("#") == -1) { + // Generic filename in all cases + return getDefaultFileName(); + } + return DEFAULT_NAME.replace("#", Integer.toString(index)); + } /** * Fetches the InputStream to read the contents, based @@ -667,7 +679,8 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { for (int i=0 ; i < this.getNumberOfSheets(); i++) { int sheetNumber = (i+1); XSSFSheet sheet = (XSSFSheet) this.getSheetAt(i); - PackagePartName partName = PackagingURIHelper.createPartName("/xl/worksheets/sheet" + sheetNumber + ".xml"); + PackagePartName partName = PackagingURIHelper.createPartName( + WORKSHEET.getFileName(sheetNumber)); PackageRelationship rel = corePart.addRelationship(partName, TargetMode.INTERNAL, WORKSHEET.getRelation(), "rSheet" + sheetNumber); PackagePart part = pkg.createPart(partName, WORKSHEET.getContentType()); @@ -683,7 +696,17 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { workbook.getSheets().getSheetArray(i).setSheetId(sheetNumber); // If our sheet has comments, then write out those - // TODO + if(sheet.hasComments()) { + CommentsTable ct = (CommentsTable)sheet.getCommentsSourceIfExists(); + PackagePartName ctName = PackagingURIHelper.createPartName( + SHEET_COMMENTS.getFileName(sheetNumber)); + part.addRelationship(ctName, TargetMode.INTERNAL, SHEET_COMMENTS.getRelation(), "rComments"); + PackagePart ctPart = pkg.createPart(ctName, SHEET_COMMENTS.getContentType()); + + out = ctPart.getOutputStream(); + ct.writeTo(out); + out.close(); + } } // Write shared strings and styles diff --git a/src/ooxml/testcases/org/apache/poi/xssf/model/TestCommentsTable.java b/src/ooxml/testcases/org/apache/poi/xssf/model/TestCommentsTable.java index 268af0919..413c96b83 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/model/TestCommentsTable.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/model/TestCommentsTable.java @@ -20,6 +20,7 @@ package org.apache.poi.xssf.model; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Comment; @@ -128,7 +129,7 @@ public class TestCommentsTable extends TestCase { assertEquals(2, cc7.getColumn()); } - public void DISABLEDtestWriteRead() throws Exception { + public void testWriteRead() throws Exception { File xml = new File( System.getProperty("HSSF.testdata.path") + File.separator + "WithVariousData.xlsx" diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFComment.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFComment.java index f1f188273..6a977effb 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFComment.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFComment.java @@ -78,6 +78,26 @@ public class TestHSSFComment extends TestCase { assertEquals(commentText, comment.getString().getString()); assertEquals(cellRow, comment.getRow()); assertEquals(cellColumn, comment.getColumn()); + + + // Change slightly, and re-test + comment.setString(new HSSFRichTextString("New Comment Text")); + + out = new ByteArrayOutputStream(); + wb.write(out); + out.close(); + + wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + sheet = wb.getSheetAt(0); + cell = sheet.getRow(cellRow).getCell(cellColumn); + comment = cell.getCellComment(); + + assertNotNull(comment); + assertEquals(HSSFSimpleShape.OBJECT_TYPE_COMMENT, comment.getShapeType()); + assertEquals(commentAuthor, comment.getAuthor()); + assertEquals("New Comment Text", comment.getString().getString()); + assertEquals(cellRow, comment.getRow()); + assertEquals(cellColumn, comment.getColumn()); } /**