add FontStyle

This commit is contained in:
Looly 2025-11-26 19:40:52 +08:00
parent c34bdaf776
commit b3d17e70ae
3 changed files with 87 additions and 28 deletions

View File

@ -0,0 +1,57 @@
package cn.hutool.v7.poi.word;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import java.awt.Color;
import java.awt.Font;
/**
* 字体样式
*
* @param font 字体信息
* @param color 字体颜色
* @author looly
* @since 7.0.0
*/
public record FontStyle(Font font, Color color) {
/**
* 构造
*
* @param name 字体名称
* @param style 字体样式{@link Font#PLAIN}, {@link Font#BOLD}, {@link Font#ITALIC}
* @param size 字体大小
*/
@SuppressWarnings("MagicConstant")
public FontStyle(final String name, final int style, final int size) {
this(new Font(name, style, size), null);
}
/**
* 构造
*
* @param name 字体名称
* @param style 字体样式{@link Font#PLAIN}, {@link Font#BOLD}, {@link Font#ITALIC}
* @param size 字体大小
* @param color 字体颜色
*/
@SuppressWarnings("MagicConstant")
public FontStyle(final String name, final int style, final int size, final Color color) {
this(new Font(name, style, size), color);
}
/**
* 填充字体样式到段落
*
* @param run 段落对象
*/
public void fill(final XWPFRun run) {
run.setFontFamily(font.getFamily());
run.setFontSize(font.getSize());
run.setBold(font.isBold());
run.setItalic(font.isItalic());
if (null != color) {
run.setColor(String.format("%02X", color.getRGB()));
}
}
}

View File

@ -16,13 +16,13 @@
package cn.hutool.v7.poi.word; package cn.hutool.v7.poi.word;
import org.apache.poi.common.usermodel.PictureType; import cn.hutool.v7.core.array.ArrayUtil;
import cn.hutool.v7.core.io.file.FileUtil;
import cn.hutool.v7.core.io.IORuntimeException; import cn.hutool.v7.core.io.IORuntimeException;
import cn.hutool.v7.core.io.IoUtil; import cn.hutool.v7.core.io.IoUtil;
import cn.hutool.v7.core.io.file.FileUtil;
import cn.hutool.v7.core.lang.Assert; import cn.hutool.v7.core.lang.Assert;
import cn.hutool.v7.core.array.ArrayUtil;
import cn.hutool.v7.poi.POIException; import cn.hutool.v7.poi.POIException;
import org.apache.poi.common.usermodel.PictureType;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units; import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
@ -30,7 +30,6 @@ import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph; 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.io.*; import java.io.*;
/** /**
@ -51,7 +50,7 @@ public class Word07Writer implements Closeable {
*/ */
protected boolean isClosed; protected boolean isClosed;
// region ----- Constructor start // region ----- Constructor
/** /**
* 构造 * 构造
@ -111,14 +110,15 @@ public class Word07Writer implements Closeable {
return this; return this;
} }
// region ----- addText
/** /**
* 增加一个段落 * 增加一个段落
* *
* @param font 字体信息{@link Font} * @param font 字体信息{@link FontStyle}
* @param texts 段落中的文本支持多个文本作为一个段落 * @param texts 段落中的文本支持多个文本作为一个段落
* @return this * @return this
*/ */
public Word07Writer addText(final Font font, final String... texts) { public Word07Writer addText(final FontStyle font, final String... texts) {
return addText(null, font, texts); return addText(null, font, texts);
} }
@ -126,11 +126,11 @@ public class Word07Writer implements Closeable {
* 增加一个段落 * 增加一个段落
* *
* @param align 段落对齐方式{@link ParagraphAlignment} * @param align 段落对齐方式{@link ParagraphAlignment}
* @param font 字体信息{@link Font} * @param font 字体信息{@link FontStyle}
* @param texts 段落中的文本支持多个文本作为一个段落 * @param texts 段落中的文本支持多个文本作为一个段落
* @return this * @return this
*/ */
public Word07Writer addText(final ParagraphAlignment align, final Font font, final String... texts) { public Word07Writer addText(final ParagraphAlignment align, final FontStyle font, final String... texts) {
final XWPFParagraph p = this.doc.createParagraph(); final XWPFParagraph p = this.doc.createParagraph();
if (null != align) { if (null != align) {
p.setAlignment(align); p.setAlignment(align);
@ -141,15 +141,13 @@ public class Word07Writer implements Closeable {
run = p.createRun(); run = p.createRun();
run.setText(text); run.setText(text);
if (null != font) { if (null != font) {
run.setFontFamily(font.getFamily()); font.fill(run);
run.setFontSize(font.getSize());
run.setBold(font.isBold());
run.setItalic(font.isItalic());
} }
} }
} }
return this; return this;
} }
// endregion
/** /**
* 增加表格数据 * 增加表格数据
@ -164,6 +162,7 @@ public class Word07Writer implements Closeable {
return this; return this;
} }
// region ----- addPicture
/** /**
* 增加图片单独成段落 * 增加图片单独成段落
* *
@ -249,7 +248,9 @@ public class Word07Writer implements Closeable {
} }
return this; return this;
} }
// endregion
// region ----- flush
/** /**
* 将Excel Workbook刷出到预定义的文件<br> * 将Excel Workbook刷出到预定义的文件<br>
* 如果用户未自定义输出的文件将抛出{@link NullPointerException}<br> * 如果用户未自定义输出的文件将抛出{@link NullPointerException}<br>
@ -308,6 +309,7 @@ public class Word07Writer implements Closeable {
} }
return this; return this;
} }
// endregion
/** /**
* 关闭Word文档<br> * 关闭Word文档<br>

View File

@ -40,8 +40,8 @@ public class WordWriterTest {
@Disabled @Disabled
public void writeTest() { public void writeTest() {
final Word07Writer writer = new Word07Writer(); final Word07Writer writer = new Word07Writer();
writer.addText(new Font("方正小标宋简体", Font.PLAIN, 22), "我是第一部分", "我是第二部分"); writer.addText(new FontStyle("方正小标宋简体", Font.PLAIN, 22), "我是第一部分", "我是第二部分");
writer.addText(new Font("宋体", Font.PLAIN, 22), "我是正文第一部分", "我是正文第二部分"); writer.addText(new FontStyle("宋体", Font.PLAIN, 22), "我是正文第一部分", "我是正文第二部分");
writer.flush(FileUtil.file("e:/wordWrite.docx")); writer.flush(FileUtil.file("e:/wordWrite.docx"));
writer.close(); writer.close();
Console.log("OK"); Console.log("OK");
@ -60,7 +60,7 @@ public class WordWriterTest {
@Test @Test
@Disabled @Disabled
public void writeTableTest(){ public void writeTableTest() {
final Word07Writer writer = new Word07Writer(); final Word07Writer writer = new Word07Writer();
final Map<String, Object> map = new LinkedHashMap<>(); final Map<String, Object> map = new LinkedHashMap<>();
map.put("姓名", "张三"); map.put("姓名", "张三");
@ -94,9 +94,9 @@ public class WordWriterTest {
final ArrayList<Map<String, Object>> mapArrayList = ListUtil.of(data, data2); final ArrayList<Map<String, Object>> mapArrayList = ListUtil.of(data, data2);
// 添加段落标题 // 添加段落标题
writer.addText(new Font("方正小标宋简体", Font.PLAIN, 22), "我是第一部分"); writer.addText(new FontStyle("方正小标宋简体", Font.PLAIN, 22), "我是第一部分");
// 添加段落正文 // 添加段落正文
writer.addText(new Font("宋体", Font.PLAIN, 13), "我是正文第一部分"); writer.addText(new FontStyle("宋体", Font.PLAIN, 13), "我是正文第一部分");
writer.addTable(mapArrayList); writer.addTable(mapArrayList);
// 写出到文件 // 写出到文件
writer.flush(FileUtil.file("d:/test/a.docx")); writer.flush(FileUtil.file("d:/test/a.docx"));
@ -105,7 +105,7 @@ public class WordWriterTest {
} }
@Test @Test
public void overflowTest(){ public void overflowTest() {
final Word07Writer word07Writer = new Word07Writer(); final Word07Writer word07Writer = new Word07Writer();
final List<Object> list = ListUtil.of(false); final List<Object> list = ListUtil.of(false);
final List<Object> list2 = ListUtil.of(false); final List<Object> list2 = ListUtil.of(false);
@ -117,7 +117,7 @@ public class WordWriterTest {
@Test @Test
@Disabled @Disabled
public void writeBeanAsTableTest(){ public void writeBeanAsTableTest() {
final List<Vo> of = ListUtil.of( final List<Vo> of = ListUtil.of(
new Vo("测试1", new BigDecimal(12), new BigDecimal(2)), new Vo("测试1", new BigDecimal(12), new BigDecimal(2)),
new Vo("测试2", new BigDecimal(13), new BigDecimal(2)), new Vo("测试2", new BigDecimal(13), new BigDecimal(2)),
@ -133,7 +133,7 @@ public class WordWriterTest {
@Data @Data
@AllArgsConstructor @AllArgsConstructor
private static class Vo{ private static class Vo {
private String name; private String name;
private BigDecimal amount; private BigDecimal amount;
private BigDecimal onYear; private BigDecimal onYear;