poi-tl
poi-tl copied to clipboard
插入附件之csv
你好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>";
没有试过,话说csv怎么插入进去的,我在word中好像没找到这个功能。
csv不是Microsoft的文档,应该只能这样插入
插入-对象-由文件创建
应该是OLE对象吧
可以参照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;
}`
没有试过,话说csv怎么插入进去的,我在word中好像没找到这个功能。
你好,为何word文档中插入xlsx附件,附件打开关闭图标变小了
#1024