根据评审意见完善excel,word 和pdf的工具类

This commit is contained in:
weiweiw 2024-08-27 14:10:55 +08:00
parent c137f8428d
commit 7ca683ab04
9 changed files with 266 additions and 355 deletions

View File

@ -148,6 +148,17 @@
<artifactId>itextpdf</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,309 +0,0 @@
package com.bonus.common.core.utils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.Objects;
/**
* 实用程序类用于生成和导出Word和PDF文档
* 还提供下载文件和读取文件内容的方法
*/
public class WordUtils {
public static String pdf_fix = "pdf";
public static String doc_fix = "doc";
public static String docx_fix = "docx";
/**
* FreeMarker配置实例
*/
private static Configuration configuration = null;
static {
configuration = new Configuration(Configuration.VERSION_2_3_30);
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(WordUtils.class, "/download/");
}
// 私有构造函数防止实例化
private WordUtils() {
throw new AssertionError();
}
/**
* 导出生成的Word文档
* @param request HttpServletRequest对象
* @param response HttpServletResponse对象
* @param map 数据模型
* @param title 文件标题
* @param ftlFile FreeMarker模板文件
* @throws IOException 可能抛出的IO异常
*/
public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile) throws IOException {
Template freemarkerTemplate = configuration.getTemplate(ftlFile);
File file = null;
InputStream fin = null;
ServletOutputStream out = null;
try {
// 调用工具类的createDoc方法生成Word文档
file = createDoc(map, freemarkerTemplate);
fin = new FileInputStream(file);
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件名
String fileName = title + ".docx";
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
out = response.getOutputStream();
byte[] buffer = new byte[512];
int bytesToRead;
// 通过循环将读入的Word文件的内容输出到浏览器中
while ((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} finally {
if (fin != null) {
fin.close();
}
if (out != null) {
out.close();
}
// 删除临时文件
if (file != null) {
file.delete();
}
}
}
/**
* 生成Word文档
* @param dataMap 数据模型
* @param template FreeMarker模板
* @return 生成的Word文档文件
*/
private static File createDoc(Map<?, ?> dataMap, Template template) {
String name = "sellPlan.doc";
File f = new File(name);
try (Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8")) {
// 使用FreeMarker生成文档
template.process(dataMap, w);
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
return f;
}
/**
* 导出生成的Word文档到指定路径
* @param request HttpServletRequest对象
* @param response HttpServletResponse对象
* @param map 数据模型
* @param title 文件标题
* @param ftlFile FreeMarker模板文件
* @param path 文件保存路径
* @throws IOException 可能抛出的IO异常
*/
public static void exportMillCertificateWord2(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile, String path) throws IOException {
Template freemarkerTemplate = configuration.getTemplate(ftlFile);
File file = null;
InputStream fin = null;
OutputStream out = null;
String uploadPath = path + "word" + File.separator;
try {
file = createDoc(map, freemarkerTemplate);
fin = new FileInputStream(file);
File file2 = new File(uploadPath);
if (!file2.exists()) {
file2.mkdirs();
}
String fileName = uploadPath + File.separator + title + ".doc";
out = new FileOutputStream(new File(fileName));
byte[] buffer = new byte[512];
int bytesToRead;
while ((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} finally {
if (fin != null) {
fin.close();
}
if (out != null) {
out.close();
}
if (file != null) {
file.delete();
}
}
}
/**
* 导出PDF文档
* @param request HttpServletRequest对象
* @param response HttpServletResponse对象
* @param titleName 文件标题
* @param fileName 文件路径
* @throws IOException 可能抛出的IO异常
*/
public static void exportPdf(HttpServletRequest request, HttpServletResponse response, String titleName, String fileName) throws IOException {
File file = new File(fileName);
try (InputStream fin = new FileInputStream(file); ServletOutputStream out = response.getOutputStream()) {
response.setCharacterEncoding("utf-8");
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(titleName, "UTF-8"));
byte[] buffer = new byte[512];
int bytesToRead;
while ((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
}
}
/**
* 导出文件
* @param request HttpServletRequest对象
* @param response HttpServletResponse对象
* @param fileName 文件名
* @param decode 文件内容的字节数组
* @throws IOException 可能抛出的IO异常
*/
public static void exportFile(HttpServletRequest request, HttpServletResponse response, String fileName, byte[] decode) throws IOException {
try (InputStream fin = new ByteArrayInputStream(decode); ServletOutputStream out = response.getOutputStream()) {
response.setCharacterEncoding("utf-8");
String subfix = fileName.substring(fileName.lastIndexOf(".") + 1);
if (Objects.equals(subfix, pdf_fix)) {
response.setContentType("application/pdf");
} else if (Objects.equals(subfix, doc_fix) || Objects.equals(subfix, docx_fix)) {
response.setContentType("application/msword");
}
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
byte[] buffer = new byte[512];
int bytesToRead;
while ((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
}
}
/**
* 下载指定路径的文件
* @param outputDir 要下载的文件的绝对路径
* @param fileName 文件名
* @param response HttpServletResponse对象
* @throws IOException 可能抛出的IO异常
*/
public static void fileDown(String outputDir, String fileName, HttpServletResponse response) throws IOException {
try (FileInputStream is = new FileInputStream(new File(outputDir))) {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("content-disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
ServletOutputStream os = response.getOutputStream();
IOUtils.copy(is, os);
}
}
/**
* 下载Word文件
* @param request HttpServletRequest对象
* @param response HttpServletResponse对象
* @param titleName 文件标题
* @param fileName 文件路径
* @throws IOException 可能抛出的IO异常
*/
public static void exportWord(HttpServletRequest request, HttpServletResponse response, String titleName, String fileName) throws IOException {
File file = new File(fileName);
try (InputStream fin = new FileInputStream(file); ServletOutputStream out = response.getOutputStream()) {
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(titleName, "UTF-8"));
byte[] buffer = new byte[512];
int bytesToRead;
while ((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
}
}
/**
* 下载视频文件
* @param request HttpServletRequest对象
* @param response HttpServletResponse对象
* @param titleName 文件标题
* @param fileName 文件路径
* @throws IOException 可能抛出的IO异常
*/
public static void exportVideo(HttpServletRequest request, HttpServletResponse response, String titleName, String fileName) throws IOException {
File file = new File(fileName);
try (InputStream fin = new FileInputStream(file); ServletOutputStream out = response.getOutputStream()) {
response.setCharacterEncoding("utf-8");
response.setContentType("video/mp4");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(titleName, "UTF-8"));
byte[] buffer = new byte[512];
int bytesToRead;
while ((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
file.delete();
}
}
/**
* 主方法包含文件读取的示例
* @param args 命令行参数
* @throws IOException 可能抛出的IO异常
*/
public static void main(String[] args) throws IOException {
String filePath = "F:\\File\\guest.txt";
Path path = Paths.get(filePath);
// 使用GBK编码读取文件
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "GBK"))) {
String line;
while ((line = reader.readLine()) != null) {
// 处理每一行的内容
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// 使用UTF-8编码读取文件
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-8"))) {
String line;
while ((line = reader.readLine()) != null) {
// 处理每一行的内容
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// 读取文件的字节内容并转换为字符串
byte[] data = Files.readAllBytes(path);
String result = new String(data, "GBK-8");
System.out.println(result);
// 使用FileInputStream和InputStreamReader读取文件内容
try (FileInputStream fis = new FileInputStream(filePath);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr)) {
String strTmp;
while ((strTmp = br.readLine()) != null) {
System.out.println(strTmp);
}
}
}
}

View File

@ -13,9 +13,11 @@ import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import com.bonus.common.core.utils.StringUtils;
import org.springframework.web.multipart.MultipartFile;
@ -277,4 +279,21 @@ public class FileUtils {
return null;
}
}
/**
* 下载指定路径的文件
* @param outputDir 要下载的文件的绝对路径
* @param fileName 文件名
* @param response HttpServletResponse对象
* @throws IOException 可能抛出的IO异常
*/
public static void fileDownload(String outputDir, String fileName, HttpServletResponse response) throws IOException {
try (FileInputStream is = new FileInputStream(new File(outputDir))) {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("content-disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
ServletOutputStream os = response.getOutputStream();
IOUtils.copy(is, os);
}
}
}

View File

@ -1,6 +1,7 @@
package com.bonus.common.core.utils.poi;
import com.itextpdf.text.DocumentException;
import org.apache.commons.io.IOUtils;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
@ -10,8 +11,13 @@ import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.DecimalFormat;
public interface DocumentUtil {
@ -77,4 +83,14 @@ public interface DocumentUtil {
return pieChart;
}
public default void fileDown(String outputDir, String fileName, HttpServletResponse response) throws IOException {
try (FileInputStream is = new FileInputStream(new File(outputDir))) {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("content-disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
ServletOutputStream os = response.getOutputStream();
IOUtils.copy(is, os);
}
}
}

View File

@ -1,6 +1,8 @@
package com.bonus.common.core.utils.poi;
import com.bonus.common.core.utils.StringUtils;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import lombok.Getter;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
@ -9,41 +11,97 @@ import java.io.*;
public class PdfUtil implements DocumentUtil {
/**
* -- GETTER --
* 获取文档对象
*/
private final Document document;
private final PdfWriter writer;
private BaseFont baseFont;
private int defaultFontSize = 12;
/**
* 初始化 PDF 文档
* @param pdfPath PDF 本地文件路径
* @param fontPath 指定字体路径并将字体嵌入到pdf文档中保证在其他计算机上以同样字体显示如果为空则使用默认支持中文字体
* @param defaultFontSize 指定字体大小传入非整数值则默认为12
* @throws DocumentException 文档异常处理
* @throws IOException IO 异常处理
*/
public PdfUtil(String pdfPath) throws DocumentException, IOException {
public PdfUtil(String pdfPath, String fontPath, int defaultFontSize) throws DocumentException, IOException {
createBaseFont(fontPath);
if (defaultFontSize > 0) {
this.defaultFontSize = defaultFontSize;
}
document = new Document();
writer = PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
document.open();
}
/**
* 获取文档对象以便对文档做其他自定义的操作
*/
public Document getDocument() {
return document;
}
/**
* 初始化 PDF 文档
* @param response http响应
* @param fontPath 指定字体路径如果为空则使用默认支持中文字体
* @param defaultFontSize 指定字体大小默认为12
* @throws DocumentException 文档异常处理
* @throws IOException IO 异常处理
*/
public PdfUtil (HttpServletResponse response) throws DocumentException, IOException {
public PdfUtil (HttpServletResponse response, String fontPath, int defaultFontSize) throws DocumentException, IOException {
createBaseFont(fontPath);
if (defaultFontSize > 0) {
this.defaultFontSize = defaultFontSize;
}
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"generated.pdf\"");
document = new Document();
writer = PdfWriter.getInstance(document, response.getOutputStream());
document.open();
}
public BaseFont getBaseFont() {
return baseFont;
}
/*
* 设置PDF文档的元数据中的标题通常通过文件 -> 属性)查看
* @param title 标题内容
*/
public void addTitle(String title){
document.addTitle(title);
}
private void createBaseFont(String fontPath) throws DocumentException, IOException {
if (StringUtils.isNotBlank(fontPath)) {
File fontFile = new File(fontPath);
if (!fontFile.exists()) {
baseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
} else {
baseFont = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}
}
else {
baseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
}
}
/**
* 添加段落
* @param text 段落文本
* @param font 字体样式
* @param font 字体样式为空则使用默认字体样式
* @throws DocumentException 文档异常处理
*/
public Paragraph addParagraph(String text, Font font) throws DocumentException {
if (font == null) {
font = new Font(baseFont, defaultFontSize, Font.NORMAL);
}
Paragraph paragraph = new Paragraph(text, font);
document.add(paragraph);
return paragraph;
@ -54,20 +112,23 @@ public class PdfUtil implements DocumentUtil {
* @param headers 表头数组
* @param content 表格内容
* @param numCols 表格列数
* @param font 字体样式为空则使用默认字体样式
* @throws DocumentException 文档异常处理
*/
public void addTable(String[] headers, String[][] content, int numCols) throws DocumentException {
public void addTable(String[] headers, String[][] content, int numCols, Font font) throws DocumentException {
if (font == null) {
font = new Font(baseFont, defaultFontSize, Font.NORMAL);
}
PdfPTable table = new PdfPTable(numCols);
for (String header : headers) {
PdfPCell cell = new PdfPCell(new Phrase(header));
// cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
PdfPCell cell = new PdfPCell(new Phrase(header, font));
table.addCell(cell);
}
for (String[] row : content) {
for (String cellData : row) {
table.addCell(cellData);
table.addCell(new Phrase(cellData, font));
}
}
@ -79,10 +140,13 @@ public class PdfUtil implements DocumentUtil {
* @param imagePath 图片文件路径
* @throws IOException IO 异常处理
* @throws DocumentException 文档异常处理
* @param width 柱状图的宽,传入非正数则使用默认值400,单位为像素
* @param height 柱状图的高,传入非正数则使用默认值400,单位为像素
*/
public void addImage(String imagePath) throws IOException, DocumentException {
public void addImage(String imagePath, int width, int height) throws IOException, DocumentException {
Image image = Image.getInstance(imagePath);
image.scaleToFit(500, 500); // 根据需求调整图片大小
// 根据需求调整图片大小
image.scaleToFit(width, height);
document.add(image);
}
@ -95,8 +159,10 @@ public class PdfUtil implements DocumentUtil {
* @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);
public void addStyledParagraph(String text, boolean bold, boolean italic, int fontSize, Font font) throws DocumentException {
if (font == null) {
font = new Font(baseFont, defaultFontSize, Font.NORMAL);
}
if (bold) {
font.setStyle(Font.BOLD);
}
@ -112,11 +178,13 @@ public class PdfUtil implements DocumentUtil {
* @param title 图表标题
* @param categories 目录轴的标签
* @param values 数据轴的标签
* @param width 柱状图的宽,传入非正数则使用默认值400,单位为像素
* @param height 柱状图的高,传入非正数则使用默认值400,单位为像素
*/
public void addPieChart( String title, String[] categories, double[] values) throws IOException, DocumentException {
public void addPieChart( String title, String[] categories, double[] values, int width, int height) throws IOException, DocumentException {
// 使用 JFreeChart 创建一个饼状图
JFreeChart pieChart = createPieChart(title, categories, values);
addChartToDocument(pieChart);
addChartToDocument(pieChart,width,height);
}
/**
@ -127,12 +195,14 @@ public class PdfUtil implements DocumentUtil {
* @param rowKeys 目录轴每行的key
* @param columnKeys 数据轴每列的key
* @param data 数据
* @param width 柱状图的宽,传入非正数则使用默认值400,单位为像素
* @param height 柱状图的高,传入非正数则使用默认值400,单位为像素
*/
public void addBarChart(String title, String categoryAxisLabel, String valueAxisLabel,
String[] rowKeys, String[] columnKeys, double[][] data) throws IOException, DocumentException {
String[] rowKeys, String[] columnKeys, double[][] data, int width, int height) throws IOException, DocumentException {
JFreeChart barChart = createBarChart(title, categoryAxisLabel, valueAxisLabel, rowKeys, columnKeys, data);
addChartToDocument(barChart);
addChartToDocument(barChart,width,height);
}
/**
@ -141,11 +211,15 @@ public class PdfUtil implements DocumentUtil {
* @param chart JFreeChart 对象
* @throws IOException IO 异常处理
* @throws DocumentException 文档异常处理
* @param width 柱状图的宽,传入非正数则使用默认值400,单位为像素
* @param height 柱状图的高,传入非正数则使用默认值400,单位为像素
*/
private void addChartToDocument(JFreeChart chart) throws IOException, DocumentException {
int width = 500;
int height = 400;
private void addChartToDocument(JFreeChart chart, int width, int height) throws IOException, DocumentException {
width = (width > 0) ? width : 400;
height = (height > 0) ? height : 400;
if (chart == null) {
return;
}
ByteArrayOutputStream chartOutput = new ByteArrayOutputStream();
ChartUtils.writeChartAsPNG(chartOutput, chart, width, height);
Image chartImage = Image.getInstance(chartOutput.toByteArray());
@ -153,7 +227,6 @@ public class PdfUtil implements DocumentUtil {
document.add(chartImage);
}
/**
* 关闭文档
*/

View File

@ -2,7 +2,6 @@ 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;
@ -26,7 +25,7 @@ public class WordUtil implements DocumentUtil {
}
/**
* 获取文档对象
* 获取文档对象以便对文档做其他自定义的操作
*/
public XWPFDocument getDocument() {
return document;
@ -37,15 +36,15 @@ public class WordUtil implements DocumentUtil {
*
* @param text 文本内容
* @param fontSize 字体大小
* @param font 默认字体为宋
* @param fontFamily 字体如果指定字体不在当前系统则使用默认字
* @return XWPFParagraph 段落对象可以用于更改段落其他属性
*/
public XWPFParagraph addParagraph(String text, int fontSize, String font) {
public XWPFParagraph addParagraph(String text, int fontSize, String fontFamily) {
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(text);
run.setFontSize(fontSize);
run.setFontFamily(font);
run.setFontFamily(fontFamily);
return paragraph;
}
@ -80,8 +79,8 @@ public class WordUtil implements DocumentUtil {
* 创建图片并插入到文档中
*
* @param imgFilePath 图片本地路径
* @param width 图片宽
* @param height 图片高
* @param width 图片宽单位像素
* @param height 图片高单位像素
*/
public void insertImage(String imgFilePath, int width, int height) throws RuntimeException {
try (InputStream is = new FileInputStream(imgFilePath)) {
@ -102,19 +101,25 @@ public class WordUtil implements DocumentUtil {
* @param rowKeys 目录轴每行的key
* @param columnKeys 数据轴每列的key
* @param data 数据
* @param width 柱状图的宽,传入非正数则使用默认值400,单位为像素
* @param height 柱状图的高,传入非正数则使用默认值400,单位为像素
*/
public void addBarChart(String title, String categoryAxisLabel, String valueAxisLabel,
String[] rowKeys, String[] columnKeys, double[][] data) throws IOException, DocumentException, InvalidFormatException {
String[] rowKeys, String[] columnKeys, double[][] data,int width,int height) throws IOException, DocumentException, InvalidFormatException {
width = (width > 0) ? width : 400;
height = (height > 0) ? height : 400;
JFreeChart barChart = createBarChart(title, categoryAxisLabel, valueAxisLabel, rowKeys, columnKeys, data);
ByteArrayOutputStream chartOut = new ByteArrayOutputStream();
ChartUtils.writeChartAsPNG(chartOut, barChart, 400, 400);
ChartUtils.writeChartAsPNG(chartOut, barChart, width, height);
// 将图表字节数组转为输入流并插入到文档中
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));
run.addPicture(chartIn, XWPFDocument.PICTURE_TYPE_PNG, "bar_chart.png", Units.toEMU(width), Units.toEMU(height));
}
/**
@ -124,12 +129,13 @@ public class WordUtil implements DocumentUtil {
* @param categories 目录轴的标签
* @param values 数据轴的标签
*/
public void addPieChart( String title, String[] categories, double[] values) throws IOException, DocumentException, InvalidFormatException {
public void addPieChart( String title, String[] categories, double[] values,int width,int height) throws IOException, DocumentException, InvalidFormatException {
JFreeChart pieChart = createPieChart(title, categories, values);
width = (width > 0) ? width : 400;
height = (height > 0) ? height : 400;
//将图表保存到字节数组输出流中
ByteArrayOutputStream chartOut = new ByteArrayOutputStream();
ChartUtils.writeChartAsPNG(chartOut, pieChart, 400, 400);
ChartUtils.writeChartAsPNG(chartOut, pieChart, width, height);
ByteArrayInputStream chartIn = new ByteArrayInputStream(chartOut.toByteArray());
//将图表字节数组转为输入流并插入到文档中

View File

@ -1,24 +1,83 @@
package com.bonus.common.core.utils.poi;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import org.junit.Before;
import org.junit.Test;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.mockito.Mockito;
import static org.mockito.Mockito.when;
public class PdfUtilTests {
private HttpServletResponse response;
private OutputStream outputStream;
@Before
public void setUp() throws IOException {
response = Mockito.mock(HttpServletResponse.class);
outputStream = new ByteArrayOutputStream();
// 使用匿名类模拟 ServletOutputStream
ServletOutputStream servletOutputStream = new ServletOutputStream() {
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
@Override
public void write(int b) throws IOException {
outputStream.write(b);
}
};
when(response.getOutputStream()).thenReturn(servletOutputStream);
}
@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 });
String fileName = currentPath+ "/src/test/java/com/bonus/common/core/utils/poi/testExport2.pdf";
PdfUtil pdfUtil = new PdfUtil(fileName,null,0);
BaseFont baseFont = pdfUtil.getBaseFont();
Document document = pdfUtil.getDocument();
Font font = new Font(baseFont,24, Font.NORMAL);
Paragraph paragraph = new Paragraph("字体测试数据",font);
document.add(paragraph);
pdfUtil.addTitle("单元测试");
pdfUtil.addStyledParagraph("测试文字", true, false, 12, font);
pdfUtil.addTable(new String[] { "姓名", "年龄" }, new String[][] { { "张三", "18" }, { "李四", "19" } }, 2, null);
pdfUtil.addBarChart("柱状图", "月份", "数量", new String[] { "1", "2", "3" }, new String[] { "1", "2", "3" }, new double[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } },400,400);
pdfUtil.addPieChart("饼状图", new String[] { "1月份", "2月份", "3月份" }, new double[] { 1, 2, 3 },400,400);
pdfUtil.addParagraph("测试文字", null);
pdfUtil.addStyledParagraph("测试文字样式", true, true, 12);
pdfUtil.addStyledParagraph("测试文字样式", true, true, 12, null);
String imagePath = currentPath + "/src/test/java/com/bonus/common/core/utils/poi/register.jpg";
pdfUtil.addImage(imagePath);
pdfUtil.addImage(imagePath,400,400);
pdfUtil.close();
}
@Test
public void testPdfToResponse() throws IOException, DocumentException, InterruptedException {
String currentPath = System.getProperty("user.dir");
PdfUtil pdfUtil = new PdfUtil(response,null,0);
pdfUtil.addTitle("单元测试");
pdfUtil.addStyledParagraph("测试文字", true, false, 12, null);
pdfUtil.close();
}
}

View File

@ -2,15 +2,51 @@ 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.Before;
import org.junit.Test;
import org.mockito.Mockito;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
public class WordUtilTests {
private HttpServletResponse response;
private OutputStream outputStream;
@Before
public void setUp() throws IOException {
response = Mockito.mock(HttpServletResponse.class);
outputStream = new ByteArrayOutputStream();
// 使用匿名类模拟 ServletOutputStream
ServletOutputStream servletOutputStream = new ServletOutputStream() {
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
@Override
public void write(int b) throws IOException {
outputStream.write(b);
}
};
when(response.getOutputStream()).thenReturn(servletOutputStream);
}
@Test
public void testWord() {
@ -21,9 +57,10 @@ public class WordUtilTests {
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.addBarChart("柱状图", "", "数量", new String[]{"计划", "实际"}, new String[]{"第一季度", "第二季度", "第三季度"}, new double[][]{{1, 2,3}, {4, 5,6}},0,0);
wordUtil.addPieChart("饼状图", new String[]{"1月份", "2月份", "3月份"}, new double[]{1, 2, 3},0,0);
wordUtil.saveDocumentToLocal(fileName);
wordUtil.saveDocumentToResponse(response);
wordUtil. closeDocument();
} catch (Exception ignored){
System.out.print("异常发生" + ignored.getMessage());

View File

@ -1,7 +1,7 @@
package com.bonus.system.controller;
import com.bonus.common.core.domain.R;
import com.bonus.common.core.utils.WordUtils;
import com.bonus.common.core.utils.file.FileUtils;
import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.web.page.TableDataInfo;
@ -9,7 +9,6 @@ import com.bonus.common.log.annotation.SysLog;
import com.bonus.common.log.enums.OperaType;
import com.bonus.common.core.utils.global.SystemGlobal;
import com.bonus.system.api.domain.SysLogsVo;
//import com.bonus.system.service.ExportSqlService;
import com.bonus.system.service.ExportSqlService;
import com.bonus.system.service.ISysLogService;
import io.swagger.annotations.ApiOperation;
@ -145,7 +144,7 @@ public class SysLogController extends BaseController {
try {
String dateTimeNow=exportSqlService.export("0");
String path=filePath + ExportSqlService.TABLE_NAME + dateTimeNow+ SystemGlobal.TEXT_FIX;
WordUtils.fileDown(path, "sys_log"+ dateTimeNow+".sql",response);
FileUtils.fileDownload(path, "sys_log"+ dateTimeNow+".sql",response);
} catch (Exception e) {
logger.error("文件下载失败", e);
}