通过此代码可以实现,对富文本内容进行解析,对Excel中包含多张图片导出,可以对图片进行自定义压缩,导出多样性
业务场景:前端用户提问发帖,在运营平台管理系统中对问题进行回复,只有回答过的帖子,才在前端进行展示。
后台要求导出用户前端提问帖。前端用户发帖数据为富文本内容,这里使用jsoup进行HTML代码解析。
之前没有图片的Excel导出一直使用easypoi进行处理,easypoi也可以对本地图片或图片byte[]进行导出,但是不支持多张图片,压缩图片不能控制。这里使用自己处理的方式。
public class ExcelUtilsNew {
private static final String FILE_ROOT_PATH = "/mnt/ymt_bonjour_file";
private static final String IMAGES_TEMP = "/temp/";
/**
* 导出Excel
*
* @param sheetName sheet名称
* @param title 标题
* @param values 内容
* @param wb HSSFWorkbook对象
* @return
*/
public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {
// 第一步,创建一个HSSFWorkbook,对应一个Excel文件
if (wb == null) {
wb = new HSSFWorkbook();
}
// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet(sheetName);
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
HSSFRow row = sheet.createRow(0);
// 第四步,创建单元格,并设置值表头 设置表头居中
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
//声明列对象
HSSFCell cell = null;
//创建标题
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
}
//创建内容
for (int i = 0; i < values.length; i++) {
row = sheet.createRow(i + 1);
for (int j = 0; j < values[i].length; j++) {
//将内容按顺序赋给对应的列对象
row.createCell(j).setCellValue(values[i][j]);
}
}
return wb;
}
// 主要使用这个创建XSSFWorkbook 对象,list为Excel的数据,titles为列名与list中的key的对应关系。
public static XSSFWorkbook createWB(List
其中使用jsoup解析HTML代码,及使用hutool的DFA单词树(以下简称单词树)WordTree 对可能出现的img标签进行匹配(并不是每个用户提问都是带图片),匹配到在进行解析富文本内容。
final val baseOutDTO = exclusiveConsultantBbsList(params);
if (ObjectUtil.isNotNull(baseOutDTO.getData())) {
page = baseOutDTO.getData().getList();
final WordTree wordTree = new WordTree();
for (BbsPageOutDTO pageOutDTO : page) {
//将HTML标签解析,将标签和标签分离开,单独插入表格中
Document document = Jsoup.parseBodyFragment(pageOutDTO.getBbsContent());
//
标签里面的文字
String textP = document.selectFirst("p").text();
pageOutDTO.setBbsContentText(textP);
wordTree.addWords("img");
//img的图片
if (wordTree.isMatch(pageOutDTO.getBbsContent())) {
List imgSrcs = new ArrayList();
Elements elements = document.getElementsByTag("img");
for (Element element : elements) {
String imgSrc = element.attr("src");
imgSrcs.add(imgSrc);
}
pageOutDTO.setBbsContentImg(imgSrcs);
}
final ExclusiveOutDTO exclusiveOutDTO = new ExclusiveOutDTO();
BeanUtil.copyProperties(pageOutDTO, exclusiveOutDTO);
mapList.add(BeanUtil.beanToMap(exclusiveOutDTO));
}
return R.ok();
} else {
return R.error();
}
在controller中实际导出代码
public void exportExcel(HttpServletResponse response) throws Exception {
// Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), ExclusiveOutDTO.class, page);
// Excel的表头与导出实体类的字段做映射
HashMap stringHashMap = new HashMap<>(12);
stringHashMap.put("bbsAuthorId", "用户aid");
stringHashMap.put("releaseTime", "提问发帖时间");
stringHashMap.put("bbsSubject", "帖子主题");
stringHashMap.put("bbsContentText", "提问内容");
stringHashMap.put("bbsContentImg", "提问图片");
stringHashMap.put("commentTime", "回复时间");
stringHashMap.put("commentContent", "回复内容");
stringHashMap.put("answerUser", "回复人");
XSSFWorkbook workbook = ExcelUtilsNew.createWB(mapList, stringHashMap);
for (int i = 0; i < page.size(); i++) {
if (CollUtil.isNotEmpty(page.get(i).getBbsContentImg())) {
ExcelUtilsNew.inserNetImages(workbook, i + 1, 1, 0.6f, 0.5f, page.get(i).getBbsContentImg());
}
}
// 清空压缩的临时文件
ExcelUtilsNew.deleteTempFiles();
// 调用response对象下载Excel
}
这里是easypoi的官方文档地址easypoi的官方文档
我的项目中使用easypoi的实体类示例
@Data
public class ExclusiveOutDTO implements Serializable {
private static final long serialVersionUID = -1782708760205108787L;
/**
* 作者ID
*/
@Excel(name = "用户aid", width = 30)
private String bbsAuthorId;
/**
* 发布时间
*/
@Excel(name = "提问发帖时间", width = 30)
private String releaseTime;
/**
* 帖子主题
*/
@Excel(name = "帖子主题", width = 30)
private String bbsSubject;
/**
* 提问内容
*/
// @Excel(name = "提问全量内容", width = 30)
private String bbsContent;
/**
* 提问内容
*/
@Excel(name = "提问内容", width = 30)
private String bbsContentText;
/**
* 提问内容
*/
// @Excel(name = "提问图片", width = 30)
private List bbsContentImg;
/**
* 回复时间
*/
@Excel(name = "回复时间", width = 30)
private String commentTime;
/**
* 回复内容
*/
@Excel(name = "回复内容", width = 30)
private String commentContent;
/**
* 回复人
*/
@Excel(name = "回复人", width = 30)
private String answerUser;
}
cn.afterturn
easypoi-base
3.2.0
cn.afterturn
easypoi-web
3.2.0
cn.afterturn
easypoi-annotation
3.2.0
net.coobird
thumbnailator
0.4.8
org.jsoup
jsoup
1.11.3
org.apache.commons
commons-collections4
4.1
public class FileUtil {
public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception {
File targetFile = new File(filePath);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
FileOutputStream out = new FileOutputStream(filePath + fileName);
out.write(file);
out.flush();
out.close();
}
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
return true;
} else {
return false;
}
} else {
return false;
}
}
public static String renameToUUID(String fileName) {
return UUID.randomUUID() + "." + fileName.substring(fileName.lastIndexOf(".") + 1);
}
public static void exportExcel(List> list, String title, String sheetName, Class> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response){
ExportParams exportParams = new ExportParams(title, sheetName);
exportParams.setCreateHeadRows(isCreateHeader);
defaultExport(list, pojoClass, fileName, response, exportParams);
}
/**
* 项目中默认使用这个作为Excel导出
*
* @param list
* @param pojoClass
* @param fileName
* @param response
*/
public static void exportExcel(List> list, Class> pojoClass, String fileName, HttpServletResponse response) {
defaultExport(list, pojoClass, fileName, response, new ExportParams());
}
public static void exportExcel(List> list, String title, String sheetName, Class> pojoClass,String fileName, HttpServletResponse response){
defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
}
public static void exportExcel(List
希望可以帮助到有需求的小伙伴,共同进步!!!