ASF Bugzilla – Attachment 31219 Details for
Bug 56023
[PATCH] Include cell comments in XSSFEventBasedExcelExtractor output
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
diff for this patch
diff.txt (text/plain), 10.94 KB, created by
Shaun Kalley
on 2014-01-17 05:06:59 UTC
(
hide
)
Description:
diff for this patch
Filename:
MIME Type:
Creator:
Shaun Kalley
Created:
2014-01-17 05:06:59 UTC
Size:
10.94 KB
patch
obsolete
>diff --git a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java >index 59ea919..72cb96c 100644 >--- a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java >+++ b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java >@@ -95,7 +95,14 @@ public class XSSFReader { > return styles; > } > >- >+ /** >+ * Opens up the Comments Table, parses it, >+ * and returns a handy object for working with comments. >+ */ >+ public CommentsTable getCommentsTable() throws IOException, InvalidFormatException { >+ ArrayList<PackagePart> parts = pkg.getPartsByContentType(XSSFRelation.SHEET_COMMENTS.getContentType()); >+ return parts.size() == 0 ? null : new CommentsTable(parts.get(0), null); >+ } > > /** > * Returns an InputStream to read the contents of the >diff --git a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java >index 2f5c1eb..72aa050 100644 >--- a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java >+++ b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java >@@ -18,8 +18,10 @@ package org.apache.poi.xssf.eventusermodel; > > import org.apache.poi.ss.usermodel.BuiltinFormats; > import org.apache.poi.ss.usermodel.DataFormatter; >+import org.apache.poi.xssf.model.CommentsTable; > import org.apache.poi.xssf.model.StylesTable; > import org.apache.poi.xssf.usermodel.XSSFCellStyle; >+import org.apache.poi.xssf.usermodel.XSSFComment; > import org.apache.poi.xssf.usermodel.XSSFRichTextString; > import org.xml.sax.Attributes; > import org.xml.sax.SAXException; >@@ -50,6 +52,11 @@ public class XSSFSheetXMLHandler extends DefaultHandler { > */ > private StylesTable stylesTable; > >+ /** >+ * Table with cell comments >+ */ >+ private CommentsTable commentsTable; >+ > private ReadOnlySharedStringsTable sharedStringsTable; > > /** >@@ -90,11 +97,13 @@ public class XSSFSheetXMLHandler extends DefaultHandler { > */ > public XSSFSheetXMLHandler( > StylesTable styles, >+ CommentsTable comments, > ReadOnlySharedStringsTable strings, > SheetContentsHandler sheetContentsHandler, > DataFormatter dataFormatter, > boolean formulasNotResults) { > this.stylesTable = styles; >+ this.commentsTable = comments; > this.sharedStringsTable = strings; > this.output = sheetContentsHandler; > this.formulasNotResults = formulasNotResults; >@@ -109,10 +118,11 @@ public class XSSFSheetXMLHandler extends DefaultHandler { > */ > public XSSFSheetXMLHandler( > StylesTable styles, >+ CommentsTable comments, > ReadOnlySharedStringsTable strings, > SheetContentsHandler sheetContentsHandler, > boolean formulasNotResults) { >- this(styles, strings, sheetContentsHandler, new DataFormatter(), formulasNotResults); >+ this(styles, comments, strings, sheetContentsHandler, new DataFormatter(), formulasNotResults); > } > > private boolean isTextTag(String name) { >@@ -299,7 +309,7 @@ public class XSSFSheetXMLHandler extends DefaultHandler { > } > > // Output >- output.cell(cellRef, thisStr); >+ output.cell(cellRef, thisStr, commentsTable.findCellComment(cellRef)); > } else if ("f".equals(name)) { > fIsOpen = false; > } else if ("is".equals(name)) { >@@ -346,7 +356,7 @@ public class XSSFSheetXMLHandler extends DefaultHandler { > /** A row with the (zero based) row number has ended */ > public void endRow(); > /** A cell, with the given formatted value, was encountered */ >- public void cell(String cellReference, String formattedValue); >+ public void cell(String cellReference, String formattedValue, XSSFComment comment); > /** A header or footer has been encountered */ > public void headerFooter(String text, boolean isHeader, String tagName); > } >diff --git a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFEventBasedExcelExtractor.java b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFEventBasedExcelExtractor.java >index 1a2b40e..a5c83de 100644 >--- a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFEventBasedExcelExtractor.java >+++ b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFEventBasedExcelExtractor.java >@@ -27,10 +27,10 @@ import javax.xml.parsers.SAXParser; > import javax.xml.parsers.SAXParserFactory; > > import org.apache.poi.POIXMLProperties; >-import org.apache.poi.POIXMLTextExtractor; > import org.apache.poi.POIXMLProperties.CoreProperties; > import org.apache.poi.POIXMLProperties.CustomProperties; > import org.apache.poi.POIXMLProperties.ExtendedProperties; >+import org.apache.poi.POIXMLTextExtractor; > import org.apache.poi.openxml4j.exceptions.OpenXML4JException; > import org.apache.poi.openxml4j.opc.OPCPackage; > import org.apache.poi.ss.usermodel.DataFormatter; >@@ -38,7 +38,9 @@ import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable; > import org.apache.poi.xssf.eventusermodel.XSSFReader; > import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler; > import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.SheetContentsHandler; >+import org.apache.poi.xssf.model.CommentsTable; > import org.apache.poi.xssf.model.StylesTable; >+import org.apache.poi.xssf.usermodel.XSSFComment; > import org.apache.xmlbeans.XmlException; > import org.xml.sax.ContentHandler; > import org.xml.sax.InputSource; >@@ -56,6 +58,7 @@ public class XSSFEventBasedExcelExtractor extends POIXMLTextExtractor { > private Locale locale; > private boolean includeSheetNames = true; > private boolean formulasNotResults = false; >+ private boolean includeCellComments = false; > private boolean includeHeadersFooters = true; > > public XSSFEventBasedExcelExtractor(String path) throws XmlException, OpenXML4JException, IOException { >@@ -95,6 +98,13 @@ public class XSSFEventBasedExcelExtractor extends POIXMLTextExtractor { > } > > /** >+ * Should cell comments be included? Default is false >+ */ >+ public void setIncludeCellComments(boolean includeCellComments) { >+ this.includeCellComments = includeCellComments; >+ } >+ >+ /** > * Should headers and footers be included? Default is true > */ > public void setIncludeHeadersFooters(boolean includeHeadersFooters) { >@@ -141,6 +151,7 @@ public class XSSFEventBasedExcelExtractor extends POIXMLTextExtractor { > public void processSheet( > SheetContentsHandler sheetContentsExtractor, > StylesTable styles, >+ CommentsTable comments, > ReadOnlySharedStringsTable strings, > InputStream sheetInputStream) > throws IOException, SAXException { >@@ -158,7 +169,7 @@ public class XSSFEventBasedExcelExtractor extends POIXMLTextExtractor { > SAXParser saxParser = saxFactory.newSAXParser(); > XMLReader sheetParser = saxParser.getXMLReader(); > ContentHandler handler = new XSSFSheetXMLHandler( >- styles, strings, sheetContentsExtractor, formatter, formulasNotResults); >+ styles, comments, strings, sheetContentsExtractor, formatter, formulasNotResults); > sheetParser.setContentHandler(handler); > sheetParser.parse(sheetSource); > } catch(ParserConfigurationException e) { >@@ -174,6 +185,7 @@ public class XSSFEventBasedExcelExtractor extends POIXMLTextExtractor { > ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(container); > XSSFReader xssfReader = new XSSFReader(container); > StylesTable styles = xssfReader.getStylesTable(); >+ CommentsTable comments = xssfReader.getCommentsTable(); > XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData(); > > StringBuffer text = new StringBuffer(); >@@ -185,7 +197,7 @@ public class XSSFEventBasedExcelExtractor extends POIXMLTextExtractor { > text.append(iter.getSheetName()); > text.append('\n'); > } >- processSheet(sheetExtractor, styles, strings, stream); >+ processSheet(sheetExtractor, styles, comments, strings, stream); > if (includeHeadersFooters) { > sheetExtractor.appendHeaderText(text); > } >@@ -226,13 +238,17 @@ public class XSSFEventBasedExcelExtractor extends POIXMLTextExtractor { > output.append('\n'); > } > >- public void cell(String cellRef, String formattedValue) { >+ public void cell(String cellRef, String formattedValue, XSSFComment comment) { > if(firstCellOfRow) { > firstCellOfRow = false; > } else { > output.append('\t'); > } > output.append(formattedValue); >+ if (includeCellComments && comment != null) { >+ String commentText = comment.getString().getString().replace('\n', ' '); >+ output.append(" Comment by ").append(comment.getAuthor()).append(": ").append(commentText); >+ } > } > > public void headerFooter(String text, boolean isHeader, String tagName) { >diff --git a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java >index ab8f18c..ca26151 100644 >--- a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java >+++ b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java >@@ -179,4 +179,33 @@ public final class TestXSSFEventBasedExcelExtractor extends TestCase { > XSSFTestDataSamples.openSamplePackage("56011.xlsx")); > assertEquals(expectedOutput, fixture.getText()); > } >+ >+ /** >+ * Test that we return the output comments as the non-event-based >+ * XSSFExcelExtractor. >+ */ >+ public void testCommentsComparedToNonEventBasedExtractor() >+ throws Exception { >+ >+ String expectedOutputWithComments = >+ "Sheet1\n" + >+ "abc Comment by Shaun Kalley: Shaun Kalley: You gotta see this one!\t123\n"; >+ >+ String expectedOutputWithoutComments = >+ "Sheet1\n" + >+ "abc\t123\n"; >+ >+ XSSFExcelExtractor extractor = new XSSFExcelExtractor( >+ XSSFTestDataSamples.openSampleWorkbook("commentTest.xlsx")); >+ assertEquals(expectedOutputWithoutComments, extractor.getText()); >+ extractor.setIncludeCellComments(true); >+ assertEquals(expectedOutputWithComments, extractor.getText()); >+ >+ XSSFEventBasedExcelExtractor fixture = >+ new XSSFEventBasedExcelExtractor( >+ XSSFTestDataSamples.openSamplePackage("commentTest.xlsx")); >+ assertEquals(expectedOutputWithoutComments, fixture.getText()); >+ fixture.setIncludeCellComments(true); >+ assertEquals(expectedOutputWithComments, fixture.getText()); >+ } > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 56023
:
31219
|
31220
|
31225
|
31243
|
31244
|
31378