Some work on bug #45466 - Partial support for removing excel comments (won't work for all excel versions yet)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@680530 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bc0461c5ed
commit
7fd95e217f
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
<!-- Don't forget to update status.xml too! -->
|
<!-- Don't forget to update status.xml too! -->
|
||||||
<release version="3.1.1-alpha1" date="2008-??-??">
|
<release version="3.1.1-alpha1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="add">45466 - Partial support for removing excel comments (won't work for all excel versions yet)</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45437 - Detect encrypted word documents, and throw an EncryptedDocumentException instead of a OOM</action>
|
<action dev="POI-DEVELOPERS" type="fix">45437 - Detect encrypted word documents, and throw an EncryptedDocumentException instead of a OOM</action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">45404 - New class, hssf.usermodel.HSSFDataFormatter, for formatting numbers and dates in the same way that Excel does</action>
|
<action dev="POI-DEVELOPERS" type="add">45404 - New class, hssf.usermodel.HSSFDataFormatter, for formatting numbers and dates in the same way that Excel does</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45414 - Don't add too many UncalcedRecords to sheets with charts in them</action>
|
<action dev="POI-DEVELOPERS" type="fix">45414 - Don't add too many UncalcedRecords to sheets with charts in them</action>
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
<!-- Don't forget to update changes.xml too! -->
|
<!-- Don't forget to update changes.xml too! -->
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.1.1-alpha1" date="2008-??-??">
|
<release version="3.1.1-alpha1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="add">45466 - Partial support for removing excel comments (won't work for all excel versions yet)</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45437 - Detect encrypted word documents, and throw an EncryptedDocumentException instead of a OOM</action>
|
<action dev="POI-DEVELOPERS" type="fix">45437 - Detect encrypted word documents, and throw an EncryptedDocumentException instead of a OOM</action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">45404 - New class, hssf.usermodel.HSSFDataFormatter, for formatting numbers and dates in the same way that Excel does</action>
|
<action dev="POI-DEVELOPERS" type="add">45404 - New class, hssf.usermodel.HSSFDataFormatter, for formatting numbers and dates in the same way that Excel does</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45414 - Don't add too many UncalcedRecords to sheets with charts in them</action>
|
<action dev="POI-DEVELOPERS" type="fix">45414 - Don't add too many UncalcedRecords to sheets with charts in them</action>
|
||||||
|
@ -34,7 +34,24 @@ import java.util.Iterator;
|
|||||||
import org.apache.poi.hssf.model.FormulaParser;
|
import org.apache.poi.hssf.model.FormulaParser;
|
||||||
import org.apache.poi.hssf.model.Sheet;
|
import org.apache.poi.hssf.model.Sheet;
|
||||||
import org.apache.poi.hssf.model.Workbook;
|
import org.apache.poi.hssf.model.Workbook;
|
||||||
import org.apache.poi.hssf.record.*;
|
import org.apache.poi.hssf.record.BlankRecord;
|
||||||
|
import org.apache.poi.hssf.record.BoolErrRecord;
|
||||||
|
import org.apache.poi.hssf.record.CellValueRecordInterface;
|
||||||
|
import org.apache.poi.hssf.record.CommonObjectDataSubRecord;
|
||||||
|
import org.apache.poi.hssf.record.DrawingRecord;
|
||||||
|
import org.apache.poi.hssf.record.EOFRecord;
|
||||||
|
import org.apache.poi.hssf.record.ExtendedFormatRecord;
|
||||||
|
import org.apache.poi.hssf.record.FormulaRecord;
|
||||||
|
import org.apache.poi.hssf.record.HyperlinkRecord;
|
||||||
|
import org.apache.poi.hssf.record.LabelSSTRecord;
|
||||||
|
import org.apache.poi.hssf.record.NoteRecord;
|
||||||
|
import org.apache.poi.hssf.record.NumberRecord;
|
||||||
|
import org.apache.poi.hssf.record.ObjRecord;
|
||||||
|
import org.apache.poi.hssf.record.Record;
|
||||||
|
import org.apache.poi.hssf.record.StringRecord;
|
||||||
|
import org.apache.poi.hssf.record.SubRecord;
|
||||||
|
import org.apache.poi.hssf.record.TextObjectRecord;
|
||||||
|
import org.apache.poi.hssf.record.UnicodeString;
|
||||||
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
|
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
|
||||||
import org.apache.poi.hssf.record.formula.Ptg;
|
import org.apache.poi.hssf.record.formula.Ptg;
|
||||||
|
|
||||||
@ -1045,11 +1062,18 @@ public class HSSFCell
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assign a comment to this cell
|
* Assign a comment to this cell. If the supplied
|
||||||
|
* comment is null, the comment for this cell
|
||||||
|
* will be removed.
|
||||||
*
|
*
|
||||||
* @param comment comment associated with this cell
|
* @param comment comment associated with this cell
|
||||||
*/
|
*/
|
||||||
public void setCellComment(HSSFComment comment){
|
public void setCellComment(HSSFComment comment){
|
||||||
|
if(comment == null) {
|
||||||
|
removeCellComment();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
comment.setRow((short)record.getRow());
|
comment.setRow((short)record.getRow());
|
||||||
comment.setColumn(record.getColumn());
|
comment.setColumn(record.getColumn());
|
||||||
this.comment = comment;
|
this.comment = comment;
|
||||||
@ -1066,6 +1090,49 @@ public class HSSFCell
|
|||||||
}
|
}
|
||||||
return comment;
|
return comment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the comment for this cell, if
|
||||||
|
* there is one.
|
||||||
|
* WARNING - some versions of excel will loose
|
||||||
|
* all comments after performing this action!
|
||||||
|
*/
|
||||||
|
public void removeCellComment() {
|
||||||
|
HSSFComment comment = findCellComment(sheet, record.getRow(), record.getColumn());
|
||||||
|
this.comment = null;
|
||||||
|
|
||||||
|
if(comment == null) {
|
||||||
|
// Nothing to do
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Zap the underlying NoteRecord
|
||||||
|
sheet.getRecords().remove(comment.getNoteRecord());
|
||||||
|
|
||||||
|
// If we have a TextObjectRecord, is should
|
||||||
|
// be proceeed by:
|
||||||
|
// MSODRAWING with container
|
||||||
|
// OBJ
|
||||||
|
// MSODRAWING with EscherTextboxRecord
|
||||||
|
if(comment.getTextObjectRecord() != null) {
|
||||||
|
TextObjectRecord txo = comment.getTextObjectRecord();
|
||||||
|
int txoAt = sheet.getRecords().indexOf(txo);
|
||||||
|
|
||||||
|
if(sheet.getRecords().get(txoAt-3) instanceof DrawingRecord &&
|
||||||
|
sheet.getRecords().get(txoAt-2) instanceof ObjRecord &&
|
||||||
|
sheet.getRecords().get(txoAt-1) instanceof DrawingRecord) {
|
||||||
|
// Zap these, in reverse order
|
||||||
|
sheet.getRecords().remove(txoAt-1);
|
||||||
|
sheet.getRecords().remove(txoAt-2);
|
||||||
|
sheet.getRecords().remove(txoAt-3);
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException("Found the wrong records before the TextObjectRecord, can't remove comment");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now remove the text record
|
||||||
|
sheet.getRecords().remove(txo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cell comment finder.
|
* Cell comment finder.
|
||||||
|
@ -159,4 +159,13 @@ public class HSSFComment extends HSSFTextbox {
|
|||||||
}
|
}
|
||||||
super.setString(string);
|
super.setString(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the underlying Note record
|
||||||
|
*/
|
||||||
|
protected NoteRecord getNoteRecord() { return note; }
|
||||||
|
/**
|
||||||
|
* Returns the underlying Text record
|
||||||
|
*/
|
||||||
|
protected TextObjectRecord getTextObjectRecord() { return txo; }
|
||||||
}
|
}
|
||||||
|
@ -156,4 +156,37 @@ public final class TestHSSFComment extends TestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testDeleteComments() throws Exception {
|
||||||
|
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("SimpleWithComments.xls");
|
||||||
|
HSSFSheet sheet = wb.getSheetAt(0);
|
||||||
|
|
||||||
|
// Zap from rows 1 and 3
|
||||||
|
assertNotNull(sheet.getRow(0).getCell(1).getCellComment());
|
||||||
|
assertNotNull(sheet.getRow(1).getCell(1).getCellComment());
|
||||||
|
assertNotNull(sheet.getRow(2).getCell(1).getCellComment());
|
||||||
|
|
||||||
|
sheet.getRow(0).getCell(1).removeCellComment();
|
||||||
|
sheet.getRow(2).getCell(1).setCellComment(null);
|
||||||
|
|
||||||
|
// Check gone so far
|
||||||
|
assertNull(sheet.getRow(0).getCell(1).getCellComment());
|
||||||
|
assertNotNull(sheet.getRow(1).getCell(1).getCellComment());
|
||||||
|
assertNull(sheet.getRow(2).getCell(1).getCellComment());
|
||||||
|
|
||||||
|
// Save and re-load
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
wb.write(out);
|
||||||
|
out.close();
|
||||||
|
wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
|
||||||
|
|
||||||
|
// Check
|
||||||
|
assertNull(sheet.getRow(0).getCell(1).getCellComment());
|
||||||
|
assertNotNull(sheet.getRow(1).getCell(1).getCellComment());
|
||||||
|
assertNull(sheet.getRow(2).getCell(1).getCellComment());
|
||||||
|
|
||||||
|
// FileOutputStream fout = new FileOutputStream("/tmp/c.xls");
|
||||||
|
// wb.write(fout);
|
||||||
|
// fout.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ package org.apache.poi.hssf.usermodel;
|
|||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.text.Format;
|
import java.text.Format;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
Loading…
Reference in New Issue
Block a user