根据评审意见完善excel,word 和pdf的工具类
This commit is contained in:
parent
c137f8428d
commit
7ca683ab04
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 关闭文档
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
||||
//将图表字节数组转为输入流并插入到文档中
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue