poi-tl icon indicating copy to clipboard operation
poi-tl copied to clipboard

插入附件之csv

Open PhotonIV opened this issue 3 years ago • 3 comments

你好sayi,请问poi-tl可以插入csv附件吗?我尝试过修改AttachmentRenderPolicy的xml模板,和NiceXWPFDocument的新增一个csv类型的XWPFRelation,虽然成功导出了,但还是无法打开插入的文件。csv的ProgID为"Excel.SheetMacroEnabled.12",SHAPE_TYPE_ID为"_x0000_t75" 下面是我新增的XWPFRelation :

protected static XWPFRelation CSV;
static {
          try {
                Constructor<XWPFRelation> constructor = ReflectionUtils.findConstructor(XWPFRelation.class, String.class,
			String.class, String.class, POIXMLRelation.NoArgConstructor.class,
			POIXMLRelation.PackagePartConstructor.class);
		CSV = constructor.newInstance(new Object[] { "text/csv",  POIXMLDocument.PACK_OBJECT_REL_TYPE,
				"/word/embeddings/Microsoft_Excel_Macro-Enabled_Worksheet.xlsm",
				new POIXMLRelation.NoArgConstructor() {
					@Override
					public POIXMLDocumentPart init() {
						return new XWPFDocument();
					}
				}, new POIXMLRelation.PackagePartConstructor() {

				@Override
				public POIXMLDocumentPart init(PackagePart part) throws IOException, XmlException {
					return new XWPFDocument(part.getInputStream());
				}
			} });
	} catch (Exception e) {
		logger.warn("init releation error: {}", e.getMessage());
	}
}

AttachmentRenderPolicy的修改如下:

private static final String SHAPE_TYPE_XML = "<v:shapetype id=\"" + "_x0000_t75" + "\" coordsize=\"21600,21600\" o:spt=\"75\" o:preferrelative=\"t\" "
            + "                      path=\"m@4@5l@4@11@9@11@9@5xe\" filled=\"f\" stroked=\"f\">\n"
            + "                        <v:stroke joinstyle=\"miter\"/>\n"
            + "                        <v:formulas>\n"
            + "                            <v:f eqn=\"if lineDrawn pixelLineWidth 0\"/>\n"
            + "                            <v:f eqn=\"sum @0 1 0\"/>\n"
            + "                            <v:f eqn=\"sum 0 0 @1\"/>\n"
            + "                            <v:f eqn=\"prod @2 1 2\"/>\n"
            + "                            <v:f eqn=\"prod @3 21600 pixelWidth\"/>\n"
            + "                            <v:f eqn=\"prod @3 21600 pixelHeight\"/>\n"
            + "                            <v:f eqn=\"sum @0 0 1\"/>\n"
            + "                            <v:f eqn=\"prod @6 1 2\"/>\n"
            + "                            <v:f eqn=\"prod @7 21600 pixelWidth\"/>\n"
            + "                            <v:f eqn=\"sum @8 21600 0\"/>\n"
            + "                            <v:f eqn=\"prod @7 21600 pixelHeight\"/>\n"
            + "                            <v:f eqn=\"sum @10 21600 0\"/>\n"
            + "                        </v:formulas>\n"
            + "                        <v:path o:extrusionok=\"f\" gradientshapeok=\"t\" o:connecttype=\"rect\"/>\n"
            + "                        <o:lock v:ext=\"edit\" aspectratio=\"t\"/>\n"
            + "                    </v:shapetype>\n";

.....

    String wObjectXml = "<w:object xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\""
            + "             xmlns:v=\"urn:schemas-microsoft-com:vml\""
            + "             xmlns:o=\"urn:schemas-microsoft-com:office:office\""
            + "             xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\""
            + "             w:dxaOrig=\"1520\" w:dyaOrig=\"960\">\n" + shapeTypeXml
            + "                    <v:shape id=\"" + shapeId + "\" type=\"#"
                                        + SHAPE_TYPE_ID + "\" alt=\"\" style=\"width:" + widthPt + "pt;height:" + heightPt
                                        + "pt;mso-width-percent:0;mso-height-percent:0;mso-width-percent:0;mso-height-percent:0\" o:ole=\"\">\n"
            + "                        <v:imagedata r:id=\"" + "rId4" + "\" o:title=\"\"/>\n"
            + "                    </v:shape>\n"
            + "                    <o:OLEObject Type=\"Embed\" ProgID=\""+ "Excel.SheetMacroEnabled.12" + "\" ShapeID=\"" + shapeId
                                        + "\" DrawAspect=\"Icon\" ObjectID=\"_1699099791\" r:id=\""+ "rId5" + "\">\n"
            + "                     <o:FieldCodes>\\s</o:FieldCodes>\n"
            + "                    </o:OLEObject>"
            + "            </w:object>";

PhotonIV avatar Jan 18 '22 06:01 PhotonIV

没有试过,话说csv怎么插入进去的,我在word中好像没找到这个功能。

Sayi avatar Jan 18 '22 09:01 Sayi

csv不是Microsoft的文档,应该只能这样插入 插入-对象-由文件创建 image

PhotonIV avatar Jan 19 '22 01:01 PhotonIV

应该是OLE对象吧

luokui-c12 avatar May 19 '22 11:05 luokui-c12

可以参照xlsx插入ole对象的方式插入 XSSFWorkbook.addOlePackage

@Override
public int addOlePackage(byte[] oleData, String label, String fileName, String command)
        throws IOException {
    final XSSFRelation rel = XSSFRelation.OLEEMBEDDINGS;
    // find an unused part name
    OPCPackage opc = getPackage();
    PackagePartName pnOLE;
    int oleId;
    try {
        oleId = opc.getUnusedPartIndex(rel.getDefaultFileName());
        pnOLE = PackagingURIHelper.createPartName(rel.getFileName(oleId));
    } catch (InvalidFormatException e) {
        throw new IOException("ole object name not recognized", e);
    }

    PackagePart pp = opc.createPart( pnOLE, rel.getContentType() );

    Ole10Native ole10 = new Ole10Native(label, fileName, command, oleData);

    try (UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream(oleData.length+500)) {
        ole10.writeOut(bos);

        try (POIFSFileSystem poifs = new POIFSFileSystem()) {
            DirectoryNode root = poifs.getRoot();
            root.createDocument(Ole10Native.OLE10_NATIVE, bos.toInputStream());
            root.setStorageClsid(ClassIDPredefined.OLE_V1_PACKAGE.getClassID());

            // TODO: generate CombObj stream

            try (OutputStream os = pp.getOutputStream()) {
                poifs.writeFilesystem(os);
            }
        }
    }

    return oleId;
}`

wangwenwwx avatar Feb 03 '23 13:02 wangwenwwx

没有试过,话说csv怎么插入进去的,我在word中好像没找到这个功能。

你好,为何word文档中插入xlsx附件,附件打开关闭图标变小了

janlee151 avatar Apr 18 '23 09:04 janlee151

#1024

Sayi avatar Aug 07 '23 03:08 Sayi