diff --git a/bonus-common/bonus-common-core/pom.xml b/bonus-common/bonus-common-core/pom.xml
index 9b44183..5aa6a30 100644
--- a/bonus-common/bonus-common-core/pom.xml
+++ b/bonus-common/bonus-common-core/pom.xml
@@ -136,6 +136,18 @@
test
+
+
+ org.jfree
+ jfreechart
+ 1.5.3
+
+
+
+ com.itextpdf
+ itextpdf
+ 5.5.9
+
diff --git a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/annotation/Excel.java b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/annotation/Excel.java
index bfd08f8..d52f231 100644
--- a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/annotation/Excel.java
+++ b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/annotation/Excel.java
@@ -24,6 +24,13 @@ public @interface Excel
*/
public boolean isSequence() default false;
+ /**
+ * 是否是导入错误原因
+ * @return
+ */
+ public boolean isErrorMessage() default false;
+
+ /**
/**
* 导出时在excel中排序
*/
diff --git a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/DocumentUtil.java b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/DocumentUtil.java
new file mode 100644
index 0000000..b835d6f
--- /dev/null
+++ b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/DocumentUtil.java
@@ -0,0 +1,80 @@
+package com.bonus.common.core.utils.poi;
+
+import com.itextpdf.text.DocumentException;
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.ChartUtils;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
+import org.jfree.chart.plot.PiePlot;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.category.DefaultCategoryDataset;
+import org.jfree.data.general.DefaultPieDataset;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.text.DecimalFormat;
+
+public interface DocumentUtil {
+
+ /**
+ * 创建柱状图,并插入到文档中
+ *
+ * @param title 图表标题
+ * @param categoryAxisLabel 目录轴的标签
+ * @param valueAxisLabel 数据轴的标签
+ * @param rowKeys 目录轴每行的key
+ * @param columnKeys 数据轴每列的key
+ * @param data 数据
+ * @return JFreeChart Jfreechart对象
+ */
+ public default JFreeChart createBarChart(String title, String categoryAxisLabel, String valueAxisLabel,
+ String[] rowKeys, String[] columnKeys, double[][] data) throws IOException, DocumentException {
+ // 使用 JFreeChart 创建一个柱状图
+ DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+ for (int i = 0; i < rowKeys.length; i++) {
+ for (int j = 0; j < columnKeys.length; j++) {
+ dataset.addValue(data[i][j], rowKeys[i], columnKeys[j]);
+ }
+ }
+
+ JFreeChart barChart = ChartFactory.createBarChart(
+ title,
+ categoryAxisLabel,
+ valueAxisLabel,
+ dataset,
+ PlotOrientation.VERTICAL,
+ true, true, false);
+
+ //将图表保存到字节数组输出流中
+ ByteArrayOutputStream chartOut = new ByteArrayOutputStream();
+ ChartUtils.writeChartAsPNG(chartOut, barChart, 400, 400);
+ return barChart;
+ }
+
+ /**
+ * 创建饼状图,并插入到文档中
+ *
+ * @param title 图表标题
+ * @param categories 目录轴的标签
+ * @param values 数据轴的标签、
+ * @return JFreeChart Jfreechart对象
+ */
+ public default JFreeChart createPieChart(String title, String[] categories, double[] values) throws IOException, DocumentException {
+ // 使用 JFreeChart 创建一个饼状图
+ DefaultPieDataset dataset = new DefaultPieDataset();
+ for (int i = 0; i < categories.length; i++) {
+ dataset.setValue(categories[i], values[i]);
+ }
+
+ JFreeChart pieChart = ChartFactory.createPieChart(title, dataset, true, true, false);
+ // 获取饼状图的 Plot 对象
+ PiePlot plot = (PiePlot) pieChart.getPlot();
+ // 设置标签格式
+ plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
+ "{2}", new DecimalFormat("0"), new DecimalFormat("0%")));
+
+ plot.setSimpleLabels(true);
+ return pieChart;
+ }
+
+}
diff --git a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/ExcelUtil.java b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/ExcelUtil.java
index c8d6610..170a374 100644
--- a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/ExcelUtil.java
+++ b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/ExcelUtil.java
@@ -84,6 +84,7 @@ public class ExcelUtil
private static final int MAX_COMBO_STRING_LENGTH = 255;
private static final String TARGET_WITH_SEPARATOR = ".";
private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
+ private static final String IMPORT_ERROR_MESSAGE = "导入错误原因";
public static final String FORMULA_REGEX_STR = "=|-|\\+|@";
@@ -183,6 +184,7 @@ public class ExcelUtil
* 需要排除列属性
*/
public String[] excludeFields;
+ private String filedName;
public ExcelUtil(Class clazz)
{
@@ -448,7 +450,7 @@ public class ExcelUtil
{
val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator());
}
- else if (!attr.handler().equals(ExcelHandlerAdapter.class))
+ else if (!attr.handler().equals(com.bonus.common.core.utils.poi.ExcelHandlerAdapter.class))
{
val = dataFormatHandlerAdapter(val, attr, null);
}
@@ -568,6 +570,7 @@ public class ExcelUtil
{
fillExcelData(index, row);
addStatisticsRow();
+ hideErrorMessageColumnIfEmpty();
}
}
}
@@ -965,7 +968,9 @@ public class ExcelUtil
if(attr.isSequence()){
cell.setCellValue(sequence);
}
-
+ else if(attr.isErrorMessage() && StringUtils.isNotNull(value)){
+ cell.setCellValue(value.toString());
+ }
else if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value))
{
cell.setCellValue(parseDateToStr(dateFormat, value));
@@ -1219,7 +1224,6 @@ public class ExcelUtil
Cell cell = row.createCell(0);
cell.setCellStyle(styles.get("total"));
cell.setCellValue("合计");
-
for (Integer key : keys)
{
cell = row.createCell(key);
@@ -1579,35 +1583,6 @@ public class ExcelUtil
return exportExcelToLocalFile(sheetName);
}
-
- /**
- * 对list数据源将其里面的数据导出到excel表单
- doNothing().when(excelUtil).init(null, sheetName, title, Type.EXPORT);
- doNothing().when(excelUtil).exportExcelToLocalFile(filePath);
-
- // Act
- excelUtil.exportExcelToLocalFile(filePath, null, sheetName, title);
-
- // Assert
- File file = new File(filePath);
- assertTrue(file.exists());
-
- // Clean up
- file.delete();
- }
-
- @Excel
- public static class User {
- private Long id;
- private String name;
- private String sex;
- private Integer age;
- private Date birthday;
-
- // Getters and Setters
- }
- }
- */
private AjaxResult exportExcelToLocalFile(String filePath)
{
OutputStream out = null;
@@ -1631,4 +1606,51 @@ public class ExcelUtil
}
return AjaxResult.error("导出Excel失败,请联系网站管理员!");
}
+
+ public void hideErrorMessageColumnIfEmpty() {
+ int columnIndex = getColumnIndexByFieldName(IMPORT_ERROR_MESSAGE);
+ if (columnIndex != -1) {
+ boolean isEmpty = isColumnEmptyExceptHeader(columnIndex);
+ if (isEmpty) {
+ sheet.setColumnHidden(columnIndex, true);
+ }
+ }
+ }
+
+ private int getColumnIndexByFieldName(String fieldName) {
+
+ for (int columnIndex = 0; columnIndex <= sheet.getRow(0).getLastCellNum(); columnIndex++) {
+ if (fieldName.equals(sheet.getRow(0).getCell(columnIndex).getStringCellValue())) {
+ return columnIndex;
+ }
+ }
+ // 如果没有找到,返回-1
+ return -1;
+ }
+ private boolean isColumnEmptyExceptHeader( int columnIndex) {
+ // 假设列头在第一行
+ int headerRowIndex = 0;
+ Row headerRow = sheet.getRow(headerRowIndex);
+ if (headerRow == null) {
+ // 如果列头所在行不存在,则认为整列都为空
+ return true;
+ }
+ // 获取最后一行的索引
+ int lastRowNum = sheet.getLastRowNum();
+ for (int rowIndex = headerRowIndex + 1; rowIndex <= lastRowNum; rowIndex++) {
+ Row currentRow = sheet.getRow(rowIndex);
+ if (currentRow == null) {
+ continue; // 如果当前行不存在,则检查下一行
+ }
+ Cell cell = currentRow.getCell(columnIndex);
+ if (cell != null) {
+ String errorMessage = cell.getStringCellValue();
+ if (StringUtils.isNotBlank(errorMessage)) {
+ return false;
+ }
+ }
+ }
+ // 如果遍历完所有行都没有找到非空单元格,则返回true
+ return true;
+ }
}
diff --git a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/PdfUtil.java b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/PdfUtil.java
new file mode 100644
index 0000000..2ee8887
--- /dev/null
+++ b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/PdfUtil.java
@@ -0,0 +1,163 @@
+package com.bonus.common.core.utils.poi;
+import com.itextpdf.text.*;
+import com.itextpdf.text.pdf.*;
+import org.jfree.chart.ChartUtils;
+import org.jfree.chart.JFreeChart;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+
+public class PdfUtil implements DocumentUtil {
+
+ private final Document document;
+ private final PdfWriter writer;
+ /**
+ * 初始化 PDF 文档
+ * @param pdfPath PDF 本地文件路径
+ * @throws DocumentException 文档异常处理
+ * @throws IOException IO 异常处理
+ */
+ public PdfUtil(String pdfPath) throws DocumentException, IOException {
+ document = new Document();
+ writer = PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
+ document.open();
+ }
+
+
+ /**
+ * 初始化 PDF 文档
+ * @param response http响应
+ * @throws DocumentException 文档异常处理
+ * @throws IOException IO 异常处理
+ */
+ public PdfUtil (HttpServletResponse response) throws DocumentException, IOException {
+ response.setContentType("application/pdf");
+ response.setHeader("Content-Disposition", "attachment; filename=\"generated.pdf\"");
+ document = new Document();
+ writer = PdfWriter.getInstance(document, response.getOutputStream());
+ document.open();
+ }
+ /**
+ * 添加段落
+ * @param text 段落文本
+ * @param font 字体样式
+ * @throws DocumentException 文档异常处理
+ */
+ public Paragraph addParagraph(String text, Font font) throws DocumentException {
+ Paragraph paragraph = new Paragraph(text, font);
+ document.add(paragraph);
+ return paragraph;
+ }
+
+ /**
+ * 添加表格
+ * @param headers 表头数组
+ * @param content 表格内容
+ * @param numCols 表格列数
+ * @throws DocumentException 文档异常处理
+ */
+ public void addTable(String[] headers, String[][] content, int numCols) throws DocumentException {
+ PdfPTable table = new PdfPTable(numCols);
+
+ for (String header : headers) {
+ PdfPCell cell = new PdfPCell(new Phrase(header));
+// cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
+ table.addCell(cell);
+ }
+
+ for (String[] row : content) {
+ for (String cellData : row) {
+ table.addCell(cellData);
+ }
+ }
+
+ document.add(table);
+ }
+
+ /**
+ * 添加图片
+ * @param imagePath 图片文件路径
+ * @throws IOException IO 异常处理
+ * @throws DocumentException 文档异常处理
+ */
+ public void addImage(String imagePath) throws IOException, DocumentException {
+ Image image = Image.getInstance(imagePath);
+ image.scaleToFit(500, 500); // 根据需求调整图片大小
+ document.add(image);
+ }
+
+ /**
+ * 添加段落并设置样式
+ *
+ * @param text 段落文本
+ * @param bold 是否加粗
+ * @param italic 是否斜体
+ * @param fontSize 字体大小
+ * @throws DocumentException 文档异常处理
+ */
+ public void addStyledParagraph(String text, boolean bold, boolean italic, int fontSize) throws DocumentException {
+ Font font = new Font(Font.FontFamily.TIMES_ROMAN, fontSize);
+ if (bold) {
+ font.setStyle(Font.BOLD);
+ }
+ if (italic) {
+ font.setStyle(Font.ITALIC);
+ }
+ addParagraph(text, font);
+ }
+
+ /**
+ * 创建饼状图,并插入到文档中
+ *
+ * @param title 图表标题
+ * @param categories 目录轴的标签
+ * @param values 数据轴的标签
+ */
+ public void addPieChart( String title, String[] categories, double[] values) throws IOException, DocumentException {
+ // 使用 JFreeChart 创建一个饼状图
+ JFreeChart pieChart = createPieChart(title, categories, values);
+ addChartToDocument(pieChart);
+ }
+
+ /**
+ * 创建柱状图,并插入到文档中
+ * @param title 图表标题
+ * @param categoryAxisLabel 目录轴的标签
+ * @param valueAxisLabel 数据轴的标签
+ * @param rowKeys 目录轴每行的key
+ * @param columnKeys 数据轴每列的key
+ * @param data 数据
+ */
+ public void addBarChart(String title, String categoryAxisLabel, String valueAxisLabel,
+ String[] rowKeys, String[] columnKeys, double[][] data) throws IOException, DocumentException {
+
+ JFreeChart barChart = createBarChart(title, categoryAxisLabel, valueAxisLabel, rowKeys, columnKeys, data);
+ addChartToDocument(barChart);
+ }
+
+ /**
+ * 将 JFreeChart 图表添加到 PDF 文档中
+ *
+ * @param chart JFreeChart 对象
+ * @throws IOException IO 异常处理
+ * @throws DocumentException 文档异常处理
+ */
+ private void addChartToDocument(JFreeChart chart) throws IOException, DocumentException {
+ int width = 500;
+ int height = 400;
+
+ ByteArrayOutputStream chartOutput = new ByteArrayOutputStream();
+ ChartUtils.writeChartAsPNG(chartOutput, chart, width, height);
+ Image chartImage = Image.getInstance(chartOutput.toByteArray());
+ chartImage.scaleToFit(width, height);
+ document.add(chartImage);
+ }
+
+
+ /**
+ * 关闭文档
+ */
+ public void close() {
+ document.close();
+ }
+}
diff --git a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/WordUtil.java b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/WordUtil.java
index 98554bc..155ec12 100644
--- a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/WordUtil.java
+++ b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/WordUtil.java
@@ -1,74 +1,168 @@
+package com.bonus.common.core.utils.poi;
+
+import com.itextpdf.text.DocumentException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.wp.usermodel.HeaderFooterType;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
+import org.jfree.chart.ChartUtils;
+import org.jfree.chart.JFreeChart;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.math.BigInteger;
-public class WordUtil {
+public class WordUtil implements DocumentUtil {
- private XWPFDocument document;
+ private final XWPFDocument document;
+ /**
+ * 创建一个Word文档,并添加文字、图片、表格等元素
+ */
public WordUtil() {
this.document = new XWPFDocument();
}
- // 创建段落
- public void addParagraph(String text, int fontSize) {
+ /**
+ * 获取文档对象
+ */
+ public XWPFDocument getDocument() {
+ return document;
+ }
+
+ /**
+ * 添加一个文字段落,设置字体和大小
+ *
+ * @param text 文本内容
+ * @param fontSize 字体大小
+ * @param font 默认字体为宋体
+ * @return XWPFParagraph 段落对象,可以用于更改段落其他属性
+ */
+ public XWPFParagraph addParagraph(String text, int fontSize, String font) {
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(text);
run.setFontSize(fontSize);
+ run.setFontFamily(font);
+ return paragraph;
}
- // 插入图片
- public void insertImage(String imgFilePath, int width, int height) {
+ /**
+ * 创建一个表格,并插入到文档中
+ *
+ * @param rows 行数
+ * @param cols 列数
+ * @param content rows*cols的数组
+ * @param columnWidths 每列的宽度,(单位是 twips,1 twip = 1/20 point)
+ */
+ public XWPFTable addTable(int rows, int cols, String[][] content, int[] columnWidths) {
+ XWPFTable table = document.createTable(rows, cols);
+
+ for (int i = 0; i < rows; i++) {
+ XWPFTableRow row = table.getRow(i);
+ for (int j = 0; j < cols; j++) {
+ XWPFTableCell cell = row.getCell(j);
+ if (content != null && content.length > i && content[i].length > j) {
+ cell.setText(content[i][j]);
+ } else {
+ cell.setText("Row " + (i + 1) + ", Column " + (j + 1));
+ }
+ // 设置每个单元格的宽度
+ cell.getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf(columnWidths[j]));
+ }
+ }
+ return table;
+ }
+
+ /**
+ * 创建图片,并插入到文档中
+ *
+ * @param imgFilePath 图片本地路径
+ * @param width 图片宽
+ * @param height 图片高
+ */
+ public void insertImage(String imgFilePath, int width, int height) throws RuntimeException {
try (InputStream is = new FileInputStream(imgFilePath)) {
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, imgFilePath, Units.toEMU(width), Units.toEMU(height));
} catch (Exception e) {
- e.printStackTrace();
+ throw new RuntimeException("insertImage exception", e);
}
}
- // 创建表格
- public void createTable(int rows, int cols) {
- XWPFTable table = document.createTable(rows, cols);
- for (int row = 0; row < rows; row++) {
- XWPFTableRow tableRow = table.getRow(row);
- for (int cell = 0; cell < cols; cell++) {
- XWPFTableCell tableCell = tableRow.getCell(cell);
- tableCell.setText("Row " + row + ", Cell " + cell);
- }
- }
+ /**
+ * 创建柱状图,并插入到文档中
+ *
+ * @param title 图表标题
+ * @param categoryAxisLabel 目录轴的标签
+ * @param valueAxisLabel 数据轴的标签
+ * @param rowKeys 目录轴每行的key
+ * @param columnKeys 数据轴每列的key
+ * @param data 数据
+ */
+ public void addBarChart(String title, String categoryAxisLabel, String valueAxisLabel,
+ String[] rowKeys, String[] columnKeys, double[][] data) throws IOException, DocumentException, InvalidFormatException {
+ JFreeChart barChart = createBarChart(title, categoryAxisLabel, valueAxisLabel, rowKeys, columnKeys, data);
+ ByteArrayOutputStream chartOut = new ByteArrayOutputStream();
+ ChartUtils.writeChartAsPNG(chartOut, barChart, 400, 400);
+ // 将图表字节数组转为输入流并插入到文档中
+ ByteArrayInputStream chartIn = new ByteArrayInputStream(chartOut.toByteArray());
+
+ // Add chart to document
+ XWPFParagraph paragraph = document.createParagraph();
+ XWPFRun run = paragraph.createRun();
+ run.addPicture(chartIn, XWPFDocument.PICTURE_TYPE_PNG, "bar_chart.png", Units.toEMU(400), Units.toEMU(400));
}
- // 保存文档
- public void saveDocument(String filePath) {
- try (FileOutputStream out = new FileOutputStream(filePath)) {
- document.write(out);
- } catch (IOException e) {
- e.printStackTrace();
- }
+ /**
+ * 创建饼状图,并插入到文档中
+ *
+ * @param title 图表标题
+ * @param categories 目录轴的标签
+ * @param values 数据轴的标签
+ */
+ public void addPieChart( String title, String[] categories, double[] values) throws IOException, DocumentException, InvalidFormatException {
+ JFreeChart pieChart = createPieChart(title, categories, values);
+
+ //将图表保存到字节数组输出流中
+ ByteArrayOutputStream chartOut = new ByteArrayOutputStream();
+ ChartUtils.writeChartAsPNG(chartOut, pieChart, 400, 400);
+ ByteArrayInputStream chartIn = new ByteArrayInputStream(chartOut.toByteArray());
+
+ //将图表字节数组转为输入流并插入到文档中
+ XWPFParagraph paragraph = document.createParagraph();
+ XWPFRun run = paragraph.createRun();
+ run.addPicture(chartIn, XWPFDocument.PICTURE_TYPE_PNG, "pie_chart.png", Units.toEMU(400), Units.toEMU(400));
}
- // 关闭文档
- public void closeDocument() {
- try {
- document.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
+ /**
+ * 保存文档
+ * @param filePath 文档本地路径
+ */
+ public void saveDocumentToLocal(String filePath) throws IOException {
+ FileOutputStream out = new FileOutputStream(filePath);
+ document.write(out);
}
- public static void main(String[] args) {
- WordUtil wordUtil = new WordUtil();
- wordUtil.addParagraph("这是一个段落。", 16);
- wordUtil.insertImage("path/to/image.png", 200, 200);
- wordUtil.createTable(3, 3);
- wordUtil.saveDocument("example.docx");
- wordUtil.closeDocument();
+ /**
+ * 保存文档到HttpServletResponse对象中
+ * @param response 返回数据
+ */
+ public void saveDocumentToResponse(HttpServletResponse response) throws IOException{
+ response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
+ response.setCharacterEncoding("utf-8");
+ OutputStream out = response.getOutputStream();
+ document.write(out);
}
+ /**
+ * 关闭文档
+ * 完成保存结束后,一定调用此方法,否则会产生内容泄露的风险
+ */
+ public void closeDocument() throws IOException {
+ document.close();
+ }
+
}
diff --git a/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/ExcelUtilTests.java b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/ExcelUtilTests.java
index 55c03c0..383225d 100644
--- a/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/ExcelUtilTests.java
+++ b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/ExcelUtilTests.java
@@ -1,27 +1,26 @@
package com.bonus.common.core.utils.poi;
-import com.bonus.common.core.utils.poi.ExcelUtil;
import org.junit.Test;
-import com.bonus.common.core.annotation.Excel;
+
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class ExcelUtilTests {
@Test
public void testImportExcel() {
String currentPath = System.getProperty("user.dir");
System.out.println("当前执行路径: " + currentPath);
- ExcelUtil excelUtil = new ExcelUtil(Person.class);
+ ExcelUtil excelUtil = new ExcelUtil(Person.class);
currentPath +="/src/test/java/com/bonus/common/core/utils/poi/test.xlsx";
try (FileInputStream fileInputStream = new FileInputStream(currentPath)) {
List persionList = excelUtil.importExcel(fileInputStream);
- assertTrue(persionList.size() == 4);
-
- } catch (FileNotFoundException e) {
- throw new RuntimeException(e);
+ assertEquals(4, persionList.size());
+ String sex = persionList.get(0).getSex();
+ assertEquals("1", sex);
} catch (IOException e) {
throw new RuntimeException(e);
}
@@ -30,17 +29,30 @@ public class ExcelUtilTests {
@Test
public void testExportExcel() {
String currentPath = System.getProperty("user.dir");
- System.out.println("当前执行路径: " + currentPath);
- ExcelUtil excelUtil = new ExcelUtil(Person.class);
- Person p1 = new Person("admin",10);
- Person p2 = new Person("admin2",20);
-
+ ExcelUtil excelUtil = new ExcelUtil(Person.class);
+ Person p1 = new Person("admin",10,"0");
+ Person p2 = new Person("admin2",20,"1");
List personList = new ArrayList<>();
personList.add(p1);
personList.add(p2);
currentPath +="/src/test/java/com/bonus/common/core/utils/poi/testExport.xlsx";
excelUtil.exportExcelToLocalFile(currentPath,personList, "sheet1", null);
+ }
+ @Test
+ public void testExportExcelWithImportErrorMessage() {
+ String currentPath = System.getProperty("user.dir");
+ System.out.println("当前执行路径: " + currentPath);
+ ExcelUtil excelUtil = new ExcelUtil(Person.class);
+ Person p1 = new Person("admin",10,"男");
+ p1.setImportErrorMessage("用户名存在");
+ Person p2 = new Person("admin2",20,"女");
+ p2.setImportErrorMessage("数据格式不正确");
+ List personList = new ArrayList<>();
+ personList.add(p1);
+ personList.add(p2);
+ currentPath +="/src/test/java/com/bonus/common/core/utils/poi/testExportWithImportErrorMsg.xlsx";
+ excelUtil.exportExcelToLocalFile(currentPath,personList, "sheet1", null);
}
diff --git a/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/PdfUtilTests.java b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/PdfUtilTests.java
new file mode 100644
index 0000000..f224e28
--- /dev/null
+++ b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/PdfUtilTests.java
@@ -0,0 +1,24 @@
+package com.bonus.common.core.utils.poi;
+
+import com.itextpdf.text.DocumentException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class PdfUtilTests {
+ @Test
+ public void testPdf() throws IOException, DocumentException, InterruptedException {
+ String currentPath = System.getProperty("user.dir");
+ String fileName = currentPath+ "/src/test/java/com/bonus/common/core/utils/poi/testExport1.pdf";
+ PdfUtil pdfUtil = new PdfUtil(fileName);
+ pdfUtil.addStyledParagraph("测试文字", true, false, 12);
+ pdfUtil.addTable(new String[] { "姓名", "年龄" }, new String[][] { { "张三", "18" }, { "李四", "19" } }, 2);
+ pdfUtil.addBarChart("柱状图", "月份", "数量", new String[] { "1", "2", "3" }, new String[] { "1", "2", "3" }, new double[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } });
+ pdfUtil.addPieChart("饼状图", new String[] { "1月份", "2月份", "3月份" }, new double[] { 1, 2, 3 });
+ pdfUtil.addParagraph("测试文字", null);
+ pdfUtil.addStyledParagraph("测试文字样式", true, true, 12);
+ String imagePath = currentPath + "/src/test/java/com/bonus/common/core/utils/poi/register.jpg";
+ pdfUtil.addImage(imagePath);
+ pdfUtil.close();
+ }
+}
diff --git a/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/Person.java b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/Person.java
index 0cb7d13..3040cfd 100644
--- a/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/Person.java
+++ b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/Person.java
@@ -3,33 +3,52 @@ package com.bonus.common.core.utils.poi;
import com.bonus.common.core.annotation.Excel;
public class Person {
- @Excel(name = "序号", isSequence = true, cellType = Excel.ColumnType.NUMERIC, type = Excel.Type.EXPORT)
- int sequence;
+ @Excel(name = "序号", isSequence = true, type = Excel.Type.EXPORT)
+ int sequence;
@Excel(name = "姓名", cellType = Excel.ColumnType.STRING)
String name;
- @Excel(name = "年龄", isStatistics = true, cellType = Excel.ColumnType.NUMERIC)
+ @Excel(name = "年龄", cellType = Excel.ColumnType.NUMERIC)
int age;
+ @Excel(name = "性别", readConverterExp="0=男,1=女,2=未知")
+ String sex;
+ @Excel(name = "导入错误原因", isErrorMessage=true, cellType = Excel.ColumnType.STRING,type = Excel.Type.EXPORT )
+ String importErrorMessage;
+ @Excel(name = "头像", cellType = Excel.ColumnType.IMAGE, type = Excel.Type.EXPORT, width = 14,height = 14)
+ String imagePath = "http://192.168.0.56:18083/file/2024/08/15/hao_20240815100236A002.jpg";
// 公共无参构造函数
public Person() {
}
// 带参数的构造函数
- public Person(String name, int age) {
+ public Person(String name, int age, String sex) {
this.name = name;
this.age = age;
+ this.sex = sex;
}
public String getName() {
return name;
}
- public void setName(String name) {
- this.name = name;
- }
+ public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age) {
this.age = age;
}
+
+ public String getSex() {
+ return sex;
+ }
+
+ public void setSex(String sex) {
+ this.sex = sex;
+ }
+
+ public void setImportErrorMessage(String importErrorMessage) {
+ this.importErrorMessage = importErrorMessage;
+ }
+
+ public String getImportErrorMessage() {return importErrorMessage;}
}
diff --git a/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/WordUtilTests.java b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/WordUtilTests.java
new file mode 100644
index 0000000..67a4f5b
--- /dev/null
+++ b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/WordUtilTests.java
@@ -0,0 +1,55 @@
+package com.bonus.common.core.utils.poi;
+import com.itextpdf.text.DocumentException;
+import org.apache.poi.wp.usermodel.HeaderFooterType;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertTrue;
+
+
+public class WordUtilTests {
+
+ @Test
+ public void testWord() {
+ String currentPath = System.getProperty("user.dir");
+ String fileName = currentPath+"/src/test/java/com/bonus/common/core/utils/poi/testExport.docx";
+ WordUtil wordUtil = new WordUtil();
+ wordUtil.addParagraph("hello world,这是一个正文", 14, "宋体");
+ wordUtil.addTable(2, 3, new String[][] { { "1", "2", "3" }, { "4", "5", "6" } }, new int []{3000,3000,3000});
+ XWPFDocument document = wordUtil.getDocument();
+ try {
+ wordUtil.addBarChart("柱状图", "", "数量", new String[]{"计划", "实际"}, new String[]{"第一季度", "第二季度", "第三季度"}, new double[][]{{1, 2,3}, {4, 5,6}});
+ wordUtil.addPieChart("饼状图", new String[]{"1月份", "2月份", "3月份"}, new double[]{1, 2, 3});
+ wordUtil.saveDocumentToLocal(fileName);
+ wordUtil. closeDocument();
+ } catch (Exception ignored){
+ System.out.print("异常发生" + ignored.getMessage());
+ }
+ File file = new File(fileName);
+ assertTrue(file.exists());
+ }
+
+ @Test
+ public void testWordWithImage() {
+ String currentPath = System.getProperty("user.dir");
+ String fileName = currentPath+"/src/test/java/com/bonus/common/core/utils/poi/testExport1.docx";
+ WordUtil wordUtil = new WordUtil();
+ wordUtil.addParagraph("hello world,这是一个正文", 14, "宋体");
+ wordUtil.addTable(2, 3, new String[][] { { "1", "2", "3" }, { "4", "5", "6" } }, new int []{3000,3000,3000});
+ XWPFDocument document = wordUtil.getDocument();
+ try {
+ String imagePath = currentPath + "/src/test/java/com/bonus/common/core/utils/poi/register.jpg";
+ wordUtil.insertImage(imagePath, 400, 400);
+ wordUtil.saveDocumentToLocal(fileName);
+ wordUtil. closeDocument();
+
+ } catch (Exception ignored){
+ System.out.print("异常发生" + ignored.getMessage());
+ }
+ File file = new File(fileName);
+ assertTrue(file.exists());
+ }
+}
diff --git a/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/register.jpg b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/register.jpg
new file mode 100644
index 0000000..678d654
Binary files /dev/null and b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/register.jpg differ
diff --git a/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/test.xlsx b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/test.xlsx
index 485976a..79e8d30 100644
Binary files a/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/test.xlsx and b/bonus-common/bonus-common-core/src/test/java/com/bonus/common/core/utils/poi/test.xlsx differ