<action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
</release>
<release version="3.1.1-alpha1" date="2008-??-??">
+ <action dev="POI-DEVELOPERS" type="add">45537 - Include headers and footers (of slides and notes) in the extracted text from HSLF</action>
<action dev="POI-DEVELOPERS" type="fix">45472 - Fixed incorrect default row height in OpenOffice 2.3</action>
<action dev="POI-DEVELOPERS" type="fix">44692 - HSSFPicture.resize() stretched image when there was a text next to it</action>
<action dev="POI-DEVELOPERS" type="add">45543 - Optionally extract comment text with PowerPointExtractor, and initial hslf model support for comments</action>
<action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
</release>
<release version="3.1.1-alpha1" date="2008-??-??">
+ <action dev="POI-DEVELOPERS" type="add">45537 - Include headers and footers (of slides and notes) in the extracted text from HSLF</action>
<action dev="POI-DEVELOPERS" type="fix">45472 - Fixed incorrect default row height in OpenOffice 2.3</action>
<action dev="POI-DEVELOPERS" type="fix">44692 - HSSFPicture.resize() stretched image when there was a text next to it</action>
<action dev="POI-DEVELOPERS" type="add">45543 - Optionally extract comment text with PowerPointExtractor, and initial hslf model support for comments</action>
==================================================================== */
package org.apache.poi.hssf.eventusermodel;
-import java.text.DateFormat;
-import java.text.DecimalFormat;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Date;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
-import org.apache.poi.hssf.usermodel.HSSFDateUtil;
/**
* A proxy HSSFListener that keeps track of the document
this.childListener = childListener;
}
+ protected int getNumberOfCustomFormats() {
+ return customFormatRecords.size();
+ }
+ protected int getNumberOfExtendedFormats() {
+ return xfRecords.size();
+ }
+
/**
* Process this record ourselves, and then
* pass it on to our child listener
for(int i=0; i<_slides.length; i++) {
Slide slide = _slides[i];
+ // Slide header, if set
HeadersFooters hf = slide.getHeadersFooters();
- if(hf != null && hf.getHeaderText() != null) {
+ if(hf != null && hf.isHeaderVisible() && hf.getHeaderText() != null) {
ret.append(hf.getHeaderText() + "\n");
}
+ // Slide text
TextRun[] runs = slide.getTextRuns();
for(int j=0; j<runs.length; j++) {
TextRun run = runs[j];
}
}
- if(hf != null && hf.getFooterText() != null) {
+ // Slide footer, if set
+ if(hf != null && hf.isFooterVisible() && hf.getFooterText() != null) {
ret.append(hf.getFooterText() + "\n");
}
+ // Comments, if requested and present
if(getCommentText) {
Comment[] comments = slide.getComments();
for(int j=0; j<comments.length; j++) {
// master sheets in. Grab Slide list, then work from there,
// but ensure no duplicates
HashSet seenNotes = new HashSet();
+ HeadersFooters hf = _show.getNotesHeadersFooters();
+
for(int i=0; i<_slides.length; i++) {
Notes notes = _slides[i].getNotesSheet();
if(notes == null) { continue; }
Integer id = new Integer(notes._getSheetNumber());
if(seenNotes.contains(id)) { continue; }
seenNotes.add(id);
+
+ // Repeat the Notes header, if set
+ if(hf != null && hf.isHeaderVisible() && hf.getHeaderText() != null) {
+ ret.append(hf.getHeaderText() + "\n");
+ }
+ // Notes text
TextRun[] runs = notes.getTextRuns();
if(runs != null && runs.length > 0) {
for(int j=0; j<runs.length; j++) {
}
}
}
+
+ // Repeat the notes footer, if set
+ if(hf != null && hf.isFooterVisible() && hf.getFooterText() != null) {
+ ret.append(hf.getFooterText() + "\n");
+ }
}
}
\r
/**\r
* Header / Footer settings.\r
+ * \r
+ * You can get these on slides, or across all notes\r
*\r
* @author Yegor Kozlov\r
*/\r
/**
* From bug #45537
*/
- public void DISABLEDtestHeaderFooter() throws Exception {
+ public void testHeaderFooter() throws Exception {
String filename, text;
- // With a header
+ // With a header on the notes
filename = dirname + "/45537_Header.ppt";
HSLFSlideShow hslf = new HSLFSlideShow(new FileInputStream(filename));
SlideShow ss = new SlideShow(hslf);
- assertNotNull(ss.getSlides()[0].getHeadersFooters());
- assertEquals("testdoc test phrase", ss.getSlides()[0].getHeadersFooters().getHeaderText());
+ assertNotNull(ss.getNotesHeadersFooters());
+ assertEquals("testdoc test phrase", ss.getNotesHeadersFooters().getHeaderText());
ppe = new PowerPointExtractor(hslf);
+ text = ppe.getText();
+ assertFalse("Unable to find expected word in text\n" + text, text.contains("testdoc"));
+ assertFalse("Unable to find expected word in text\n" + text, text.contains("test phrase"));
+
+ ppe.setNotesByDefault(true);
text = ppe.getText();
assertTrue("Unable to find expected word in text\n" + text, text.contains("testdoc"));
assertTrue("Unable to find expected word in text\n" + text, text.contains("test phrase"));
- // And with a footer
+ // And with a footer, also on notes
filename = dirname + "/45537_Footer.ppt";
hslf = new HSLFSlideShow(new FileInputStream(filename));
ss = new SlideShow(hslf);
- assertNotNull(ss.getSlides()[0].getHeadersFooters());
- assertEquals("testdoc test phrase", ss.getSlides()[0].getHeadersFooters().getFooterText());
+ assertNotNull(ss.getNotesHeadersFooters());
+ assertEquals("testdoc test phrase", ss.getNotesHeadersFooters().getFooterText());
ppe = new PowerPointExtractor(filename);
+ text = ppe.getText();
+ assertFalse("Unable to find expected word in text\n" + text, text.contains("testdoc"));
+ assertFalse("Unable to find expected word in text\n" + text, text.contains("test phrase"));
+
+ ppe.setNotesByDefault(true);
text = ppe.getText();
assertTrue("Unable to find expected word in text\n" + text, text.contains("testdoc"));
assertTrue("Unable to find expected word in text\n" + text, text.contains("test phrase"));
/**
* Ensure that all number and formula records can be
- * turned into strings without problems
+ * turned into strings without problems.
+ * For now, we're just looking to get text back, no
+ * exceptions thrown, but in future we might also
+ * want to check the exact strings!
*/
public void testTurnToString() throws Exception {
- processFile("45365.xls");
-
- for(int i=0; i<mockListen._records.size(); i++) {
- Record r = (Record)mockListen._records.get(i);
- CellValueRecordInterface cvr = null;
+ String[] files = new String[] {
+ "45365.xls", "45365-2.xls", "MissingBits.xls"
+ };
+ for(int k=0; k<files.length; k++) {
+ processFile(files[k]);
- if(r instanceof NumberRecord) {
- cvr = (CellValueRecordInterface)r;
- }
- if(r instanceof FormulaRecord) {
- cvr = (CellValueRecordInterface)r;
- }
+ // Check we found our formats
+ assertTrue(listener.getNumberOfCustomFormats() > 5);
+ assertTrue(listener.getNumberOfExtendedFormats() > 5);
- if(cvr != null) {
- // Should always give us a string
- String s = listener.formatNumberDateCell(cvr);
- assertNotNull(s);
- assertTrue(s.length() > 0);
+ // Now check we can turn all the numeric
+ // cells into strings without error
+ for(int i=0; i<mockListen._records.size(); i++) {
+ Record r = (Record)mockListen._records.get(i);
+ CellValueRecordInterface cvr = null;
+
+ if(r instanceof NumberRecord) {
+ cvr = (CellValueRecordInterface)r;
+ }
+ if(r instanceof FormulaRecord) {
+ cvr = (CellValueRecordInterface)r;
+ }
+
+ if(cvr != null) {
+ // Should always give us a string
+ String s = listener.formatNumberDateCell(cvr);
+ assertNotNull(s);
+ assertTrue(s.length() > 0);
+ }
}
+
+ // TODO - test some specific format strings
}
-
- // TODO - test some specific format strings
}
private static final class MockHSSFListener implements HSSFListener {