Размер Excel уменьшается при сохранении с использованием библиотеки docx4j - PullRequest
0 голосов
/ 04 мая 2020

Когда я генерирую Excel, используя приведенный ниже код, размер файла составляет 79 КБ. (ШАГ 1)

Если я открою Excel, ничего не делаю и сохраняю его. Размер файла уменьшается до 33 КБ. (ШАГ 2)

В чем может быть причина этого и как я могу избежать этого?

После извлечения исключений я заметил, что есть изменение размера для рисования. xml. Шаг 2 Xml отформатирован и имеет начальные и конечные пробелы. Где в качестве шага 1 xmls TRIMMED.

Я использовал библиотеку DOC4j для реализации.

После восстановления размер файла уменьшается.

`

public static void main(String[] args) throws IOException, Exception {

String outputfilepath =System.getProperty("user.dir") + "/sample-docs/outline5.xlsx";
String imagefilePath = "D:\\Checkout\\Images\\image.jpg" ;

SpreadsheetMLPackage pkg = SpreadsheetMLPackage.createPackage();
WorksheetPart worksheet = pkg.createWorksheetPart(new PartName("/xl/worksheets/sheet1.xml"), "Sheet1", 1);

// Create Drawing part and add to sheet
Drawing drawingPart = new Drawing();
Relationship drawingRel = worksheet.addTargetPart(drawingPart);

// Add anchor XML to worksheet
org.xlsx4j.sml.CTDrawing drawing = org.xlsx4j.jaxb.Context.getsmlObjectFactory().createCTDrawing();
worksheet.getJaxbElement().setDrawing(drawing);
drawing.setId( drawingRel.getId() );

// Create image part and add to Drawing part
BinaryPartAbstractImage imagePart
= BinaryPartAbstractImage.createImagePart(pkg, drawingPart,
FileUtils.readFileToByteArray(new File(imagefilePath) ));
String imageRelID = imagePart.getSourceRelationship().getId();

drawingPart.setJaxbElement(
buildDrawingPartContentFromXmlString(imageRelID));

// Save the xlsx
SaveToZipFile saver = new SaveToZipFile(pkg);
saver.save(outputfilepath);
System.out.println("\n\n done .. " + outputfilepath);
}

public static org.docx4j.dml.spreadsheetdrawing.CTDrawing buildDrawingPartContentFromXmlString(String imageRelID) throws JAXBException {

String openXML="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> <xdr:wsDr xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"> <xdr:twoCellAnchor editAs=\"oneCell\"> <xdr:from> <xdr:col>3</xdr:col> <xdr:colOff>0</xdr:colOff> <xdr:row>3</xdr:row> <xdr:rowOff>0</xdr:rowOff> </xdr:from> <xdr:to> <xdr:col>5</xdr:col> <xdr:colOff>104775</xdr:colOff> <xdr:row>7</xdr:row> <xdr:rowOff>142875</xdr:rowOff> </xdr:to> <xdr:pic> <xdr:nvPicPr> <xdr:cNvPr id=\"2\" name=\"Picture 1\"> <a:extLst> <a:ext uri=\"{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}\"> <a16:creationId xmlns:a16=\"http://schemas.microsoft.com/office/drawing/2014/main\" id=\"{00000000-0008-0000-0000-000002000000}\"/> </a:ext> </a:extLst> </xdr:cNvPr> <xdr:cNvPicPr> <a:picLocks noChangeAspect=\"1\"/> </xdr:cNvPicPr> </xdr:nvPicPr> <xdr:blipFill> <a:blip xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" r:embed=\"rId1\" cstate=\"print\"> <a:extLst> <a:ext uri=\"{28A0092B-C50C-407E-A947-70E740481C1C}\"> <a14:useLocalDpi xmlns:a14=\"http://schemas.microsoft.com/office/drawing/2010/main\" val=\"0\"/> </a:ext> </a:extLst> </a:blip> <a:stretch> <a:fillRect/> </a:stretch> </xdr:blipFill> <xdr:spPr> <a:xfrm rot=\"18839999\"> <a:off x=\"0\" y=\"0\"/> <a:ext cx=\"714375\" cy=\"714375\"/> </a:xfrm> <a:prstGeom prst=\"rect\"> <a:avLst/> </a:prstGeom> </xdr:spPr> </xdr:pic> <xdr:clientData/> </xdr:twoCellAnchor> </xdr:wsDr>";
return (org.docx4j.dml.spreadsheetdrawing.CTDrawing)XmlUtils.unwrap(
XmlUtils.unmarshalString(openXML));
}

`

1 Ответ

0 голосов
/ 05 мая 2020

Наверное, не о чем беспокоиться.

В общем, три вещи объясняют различия в размерах файлов:

  1. различия в реализации zip (Microsoft и Java)
  2. пространства имен
  3. m c: обработка альтернативного содержимого

Подробнее https://www.docx4java.org/forums/docx-java-f6/file-size-differences-t1091.html

...