diff --git a/src/java/org/apache/poi/POIDocument.java b/src/java/org/apache/poi/POIDocument.java index 80029e373..06f101d3d 100644 --- a/src/java/org/apache/poi/POIDocument.java +++ b/src/java/org/apache/poi/POIDocument.java @@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -34,6 +35,8 @@ import org.apache.poi.hpsf.SummaryInformation; import org.apache.poi.poifs.crypt.EncryptionInfo; import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.DocumentInputStream; +import org.apache.poi.poifs.filesystem.DocumentNode; +import org.apache.poi.poifs.filesystem.NPOIFSDocument; import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; import org.apache.poi.poifs.filesystem.OPOIFSFileSystem; import org.apache.poi.poifs.filesystem.POIFSFileSystem; @@ -298,7 +301,16 @@ public abstract class POIDocument implements Closeable { mSet.write(bOut); byte[] data = bOut.toByteArray(); ByteArrayInputStream bIn = new ByteArrayInputStream(data); - outFS.createDocument(bIn,name); + + // New or Existing? + // TODO Use a createOrUpdate method for this to be cleaner! + try { + DocumentNode propSetNode = (DocumentNode)outFS.getRoot().getEntry(name); + NPOIFSDocument propSetDoc = new NPOIFSDocument(propSetNode); + propSetDoc.replaceContents(bIn); + } catch (FileNotFoundException e) { + outFS.createDocument(bIn,name); + } logger.log(POILogger.INFO, "Wrote property set " + name + " of size " + data.length); } catch(org.apache.poi.hpsf.WritingNotSupportedException wnse) { diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index 402b5d7e4..32789ca96 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -1311,6 +1311,9 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss NPOIFSDocument workbookDoc = new NPOIFSDocument(workbookNode); workbookDoc.replaceContents(new ByteArrayInputStream(getBytes())); + // Update the properties streams in the file + writeProperties(directory.getFileSystem(), null); + // Sync with the File on disk directory.getFileSystem().writeFilesystem(); } diff --git a/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java b/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java index e1d4c5e5b..e81888d06 100644 --- a/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java +++ b/src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java @@ -689,6 +689,8 @@ public class NPOIFSFileSystem extends BlockStore return getRoot().createDocument(name, stream); } + // TODO Add a createOrUpdateDocument method to simplify code + /** * create a new DocumentEntry in the root entry; the data will be * provided later