This commit is contained in:
Looly 2023-08-16 19:39:48 +08:00
parent e5d47470b1
commit 693a59b96c
3 changed files with 89 additions and 75 deletions

View File

@ -1,54 +0,0 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.poi.word;
import org.apache.poi.xwpf.usermodel.Document;
/**
* Word中的图片类型
*
* @author looly
* @since 5.1.6
*/
public enum PicType {
EMF(Document.PICTURE_TYPE_EMF),
WMF(Document.PICTURE_TYPE_WMF),
PICT(Document.PICTURE_TYPE_PICT),
JPEG(Document.PICTURE_TYPE_JPEG),
PNG(Document.PICTURE_TYPE_PNG),
DIB(Document.PICTURE_TYPE_DIB),
GIF(Document.PICTURE_TYPE_GIF),
TIFF(Document.PICTURE_TYPE_TIFF),
EPS(Document.PICTURE_TYPE_EPS),
WPG(Document.PICTURE_TYPE_WPG);
/**
* 构造
*
* @param value 图片类型值
*/
PicType(final int value) {
this.value = value;
}
private final int value;
/**
* 获取图片类型对应值
*
* @return 图片值
*/
public int getValue() {
return this.value;
}
}

View File

@ -0,0 +1,47 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.poi.word;
import org.apache.poi.common.usermodel.PictureType;
import org.dromara.hutool.core.io.file.FileNameUtil;
/**
* 图片类型工具类
*
* @author looly
* @since 6.0.0
*/
public class PictureTypeUtil {
/**
* 获取图片类型枚举
*
* @param fileName 文件名称
* @return 图片类型枚举
*/
public static PictureType getType(final String fileName) {
String extName = FileNameUtil.extName(fileName).toUpperCase();
if ("JPG".equals(extName)) {
extName = "JPEG";
}
PictureType picType;
try {
picType = PictureType.valueOf(extName);
} catch (final IllegalArgumentException e) {
// 默认值
picType = PictureType.JPEG;
}
return picType;
}
}

View File

@ -12,10 +12,10 @@
package org.dromara.hutool.poi.word; package org.dromara.hutool.poi.word;
import org.apache.poi.common.usermodel.PictureType;
import org.dromara.hutool.core.io.file.FileUtil; import org.dromara.hutool.core.io.file.FileUtil;
import org.dromara.hutool.core.io.IORuntimeException; import org.dromara.hutool.core.io.IORuntimeException;
import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.io.IoUtil;
import org.dromara.hutool.core.io.file.FileNameUtil;
import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.poi.exceptions.POIException; import org.dromara.hutool.poi.exceptions.POIException;
@ -27,11 +27,7 @@ import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun; import org.apache.poi.xwpf.usermodel.XWPFRun;
import java.awt.Font; import java.awt.Font;
import java.io.Closeable; import java.io.*;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/** /**
* Word docx生成器 * Word docx生成器
@ -51,7 +47,11 @@ public class Word07Writer implements Closeable {
*/ */
protected boolean isClosed; protected boolean isClosed;
// -------------------------------------------------------------------------- Constructor start // region ----- Constructor start
/**
* 构造
*/
public Word07Writer() { public Word07Writer() {
this(new XWPFDocument()); this(new XWPFDocument());
} }
@ -85,7 +85,7 @@ public class Word07Writer implements Closeable {
this.destFile = destFile; this.destFile = destFile;
} }
// -------------------------------------------------------------------------- Constructor end // endregion
/** /**
* 获取{@link XWPFDocument} * 获取{@link XWPFDocument}
@ -152,8 +152,8 @@ public class Word07Writer implements Closeable {
* *
* @param data 表格数据多行数据元素表示一行数据当为集合或者数组时为一行当为Map或者Bean时key表示标题values为数据 * @param data 表格数据多行数据元素表示一行数据当为集合或者数组时为一行当为Map或者Bean时key表示标题values为数据
* @return this * @return this
* @since 4.5.16
* @see TableUtil#createTable(XWPFDocument, Iterable) * @see TableUtil#createTable(XWPFDocument, Iterable)
* @since 4.5.16
*/ */
public Word07Writer addTable(final Iterable<?> data) { public Word07Writer addTable(final Iterable<?> data) {
TableUtil.createTable(this.doc, data); TableUtil.createTable(this.doc, data);
@ -171,15 +171,7 @@ public class Word07Writer implements Closeable {
*/ */
public Word07Writer addPicture(final File picFile, final int width, final int height) { public Word07Writer addPicture(final File picFile, final int width, final int height) {
final String fileName = picFile.getName(); final String fileName = picFile.getName();
final String extName = FileNameUtil.extName(fileName).toUpperCase(); return addPicture(FileUtil.getInputStream(picFile), PictureTypeUtil.getType(fileName), fileName, width, height);
PicType picType;
try {
picType = PicType.valueOf(extName);
} catch (final IllegalArgumentException e) {
// 默认值
picType = PicType.JPEG;
}
return addPicture(FileUtil.getInputStream(picFile), picType, fileName, width, height);
} }
/** /**
@ -193,7 +185,7 @@ public class Word07Writer implements Closeable {
* @return this * @return this
* @since 5.1.6 * @since 5.1.6
*/ */
public Word07Writer addPicture(final InputStream in, final PicType picType, final String fileName, final int width, final int height) { public Word07Writer addPicture(final InputStream in, final PictureType picType, final String fileName, final int width, final int height) {
return addPicture(in, picType, fileName, width, height, ParagraphAlignment.CENTER); return addPicture(in, picType, fileName, width, height, ParagraphAlignment.CENTER);
} }
@ -209,12 +201,12 @@ public class Word07Writer implements Closeable {
* @return this * @return this
* @since 5.2.4 * @since 5.2.4
*/ */
public Word07Writer addPicture(final InputStream in, final PicType picType, final String fileName, final int width, final int height, final ParagraphAlignment align) { public Word07Writer addPicture(final InputStream in, final PictureType picType, final String fileName, final int width, final int height, final ParagraphAlignment align) {
final XWPFParagraph paragraph = doc.createParagraph(); final XWPFParagraph paragraph = doc.createParagraph();
paragraph.setAlignment(align); paragraph.setAlignment(align);
final XWPFRun run = paragraph.createRun(); final XWPFRun run = paragraph.createRun();
try { try {
run.addPicture(in, picType.getValue(), fileName, Units.toEMU(width), Units.toEMU(height)); run.addPicture(in, picType, fileName, Units.toEMU(width), Units.toEMU(height));
} catch (final InvalidFormatException e) { } catch (final InvalidFormatException e) {
throw new POIException(e); throw new POIException(e);
} catch (final IOException e) { } catch (final IOException e) {
@ -226,6 +218,34 @@ public class Word07Writer implements Closeable {
return this; return this;
} }
/**
* 增加多张图片单独成段落增加后图片流关闭
*
* @param width 图片统一宽度
* @param height 图片统一高度
* @param picFiles 图片列表
* @return this
* @since 6.0.0
*/
public Word07Writer addPictures(final int width, final int height, final File... picFiles) {
final XWPFParagraph paragraph = doc.createParagraph();
XWPFRun run;
try {
for (final File picFile : picFiles) {
run = paragraph.createRun();
final String name = picFile.getName();
try(final BufferedInputStream in = FileUtil.getInputStream(picFile)){
run.addPicture(in, PictureTypeUtil.getType(name), name, Units.toEMU(width), Units.toEMU(height));
}
}
} catch (final InvalidFormatException e) {
throw new POIException(e);
} catch (final IOException e) {
throw new IORuntimeException(e);
}
return this;
}
/** /**
* 将Excel Workbook刷出到预定义的文件<br> * 将Excel Workbook刷出到预定义的文件<br>
* 如果用户未自定义输出的文件将抛出{@link NullPointerException}<br> * 如果用户未自定义输出的文件将抛出{@link NullPointerException}<br>
@ -289,6 +309,7 @@ public class Word07Writer implements Closeable {
* 关闭Word文档<br> * 关闭Word文档<br>
* 如果用户设定了目标文件先写出目标文件后给关闭工作簿 * 如果用户设定了目标文件先写出目标文件后给关闭工作簿
*/ */
@SuppressWarnings("resource")
@Override @Override
public void close() { public void close() {
if (null != this.destFile) { if (null != this.destFile) {