刚做完项目稍微总结一下。
我们遇到一个功能的时候常常面临选择技术,选不好就掉到坑里面去了就特么折腾半天不满足要求所以很难受,所以对于自己重新接触的技术真的要了解全面了之后再下手,我写这个文章是来告诉大家我项目中用到的技术
word导出使用freemarker 模板
优点:满足所有可能的需求
缺点:导出的其实是xml文件而已,只是word高版本支持xml类型的word ,手机是无法打开的,打开就是xml文件。解决办法网上有一堆,安装office 使用jacob的jar包加上jacob-1.19-x64.dll文件来调用windows的office转换成真的word(效率慢的一批),如果哪位大哥知道怎么解决麻烦告知一下啊。
还有坑巨多,freemarker的语法贼坑,没有数据就报错,然后就是你得把word先整理成xml数据(基本上网上的教程不靠谱,你得自己去摸索这个xml的含义)
综上如果是linux系统部署那你最好还是老老实实用poi吧。
代码:网上一堆,看不懂那你基本告别这个行业了。
效果:
自己上网去查查这个文档多复杂,单选,多选,图片,分页,页眉,页脚(这个是word自带的功能),都可以满足你的需求。(就是这个模板你自己得好好看看)
excel导出用jxls模板技术
优点:快,爽
缺点:暂时没发现,反正比poi爽多了
我以前也一直用poi导出excel,调整间距,excel导出不好看各种麻烦事,直到我发现jxls模板一切变得简单起来。技术很简单,几乎可以满足你所有excel的需求,所以不要怕大胆用。
贴一个官网http://jxls.sourceforge.net/samples/object_collection_xmlbuilder.html
导入导出我都写了,导入还是用的poi我觉得导入还是很简单的。我稍微封装了一下,代码贴一下。部分业务代码不贴。
说一下代码思路:读取字段属性,反射设置对象值,并判断是否为字典数据,字典数据通过注解判断,自己在类上面写个注解,字典数据替换完事。
jar包贴一下,注意版本,低版本有坑。
org.jxls
jxls-poi
1.0.16
package com.wenbao.vitwbcrm.utility;
import com.ruoyi.common.config.Global;
import com.wenbao.vitwbcrm.aop.annotation.PoiImportData;
import com.wenbao.vitwbcrm.bkydww.mapper.BaseToolMapper;
import com.wenbao.vitwbcrm.bwg.entity.BaseRelic;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.jxls.common.Context;
import org.jxls.transform.Transformer;
import org.jxls.transform.poi.PoiTransformer;
import org.jxls.util.JxlsHelper;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Jxls 模板导入导出
* Created by jhwang
* Date 2019/3/25 15:54
*/
public class JxlsUtils {
/**
* xml文件名称
*/
private String xmlName;
/**
* xml文件地址
*/
private String xmlPath;
/**
* 数据所在行
*/
private Integer rowNumber;
/**
* 数据所在工作表
*/
private Integer sheetNumber = 0;
/**
* 设置是否生成主键,默认true
*/
private boolean ifcreateId = true;
/**
* 主键默认字段
*/
private String id = "id";
public BaseToolMapper baseToolMapper;
public JxlsUtils() {}
/**
* @param xmlName 模板名称
* @param rowNumber 对应数据开始行
*/
public JxlsUtils(String xmlName,Integer rowNumber) {
this.xmlName = xmlName;
this.rowNumber = rowNumber;
//获取默认文件夹下的文件
this.xmlPath = FileUtils.getPath("jxlsxml"+"/"+xmlName.replace(File.separator,""));
}
/**
* 读取office表格中的数据
* @param xmlName 模板名称
* @return
*/
private static Object readOfficeDataStatic(String xmlName, String tableName,Integer rowNumber,Class cls, InputStream inp){
JxlsUtils jxlsUtils = new JxlsUtils(xmlName,tableName,rowNumber);
return jxlsUtils.readPoiOfficeData(cls,inp);
}
/**
* 基于poi读取office表格中的数据
* @param inputStream 读取的文件流数据,
* @return
*/
public Object readPoiOfficeData(Class cls,InputStream inputStream){
List list = new ArrayList();
//获取所有的字段
Map xmlMap = getXmlMap();
HSSFWorkbook workbook = null;
try {
workbook = new HSSFWorkbook(inputStream);
HSSFSheet hssfSheet = workbook.getSheetAt(this.sheetNumber);
//循环行
for (int rowNum = this.rowNumber; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow == null ) {
continue;
}
Object o = cls.newInstance();
for (int rowi = 0; rowi <= hssfRow.getLastCellNum(); rowi++) {
HSSFCell cell = hssfRow.getCell(rowi);
if (cell == null) {
continue;
}
//读取数据前设置单元格类型
cell.setCellType(CellType.STRING);
String value = cell.getStringCellValue();
if(xmlMap.get(rowi) != null){
BeanUtils.setProperty(o, (String) xmlMap.get(rowi), value);
}
}
//如果为null则结束循环
if(ifBenanNull(o)){
return list;
}
//是否生成主键
if(ifcreateId){
BeanUtils.setProperty(o, this.id, Uuid.AddUUid());
}
list.add(o);
}
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return list;
}
/**
* 基于jxls模板导出数据
* @param list 导出数据集合
* @return
*/
public String exportExcel(List list) throws IOException {
//模板遍历对象
String examList = "examList";
//文件临时存放地址
String fileName = DateUtils.getYYYYMMDD()+".xlsx";
File out = new File( Global.getDownloadPath()+fileName);
Context context = PoiTransformer.createInitialContext();
context.putVar(examList, list);
JxlsHelper jxlsHelper = JxlsHelper.getInstance();
Transformer transformer = jxlsHelper.createTransformer(new FileInputStream(this.xmlPath), new FileOutputStream(out));
jxlsHelper.processTemplate(context, transformer);
return fileName;
}
/**
* 基于jxls模板导出数据 横向数据导出
* @param rowlist 横向数据
* @param datalist 集合数据
* @return
*/
public String exportExcelRow(List rowlist,List datalist) throws IOException {
// try(InputStream is = GridCommandDemo.class.getResourceAsStream("grid_template.xls")) {
// try(OutputStream os = new FileOutputStream("target/grid_output2.xls")) {
// Context context = new Context();
// context.putVar("rowlist", Arrays.asList("Name", "Birthday", "Payment"));
// context.putVar("datalist", employees);
// JxlsHelper.getInstance().processGridTemplateAtCell(is, os, context, "name,birthDate,payment", "Sheet2!A1");
// }
// }
return null;
}
/**
* 判断对象是否全部为null 或者“”,如果是返回true 否返回false
* @param obj
* @return
* @throws IllegalAccessException
*/
private boolean ifBenanNull(Object obj) {
boolean flag = true;
Field[] declaredFields = obj.getClass().getDeclaredFields();
for(Field f : declaredFields){
f.setAccessible(true);
try {
if("serialVersionUID".equals(f.getName())){
continue;
}
if(BeanUtils.getProperty(obj,f.getName()) != null && !"".equals(BeanUtils.getProperty(obj,f.getName()))){
return false;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
return flag;
}
/**
* 获取xml文件中所设置的字段返回map
* key - 字段名称
* value - 字段所属位置
*/
private Map getXmlMap(){
Map map = new HashMap<>();
HSSFWorkbook workbook = null;
try {
// 读取Excel文件
FileInputStream fileInputStream = new FileInputStream(this.xmlPath);
workbook = new HSSFWorkbook(fileInputStream);
HSSFSheet hssfSheet = workbook.getSheetAt(this.sheetNumber);
HSSFRow row = hssfSheet.getRow(this.rowNumber);
// 循环列
for (int rowNum = 0; rowNum <= row.getLastCellNum(); rowNum++) {
HSSFCell cell = row.getCell(rowNum);
if (cell == null) {
continue;
}
cell.setCellType(CellType.STRING);
if(cell.getStringCellValue() != null && !"".equals(cell.getStringCellValue())){
String value = formatParamCode(cell.getStringCellValue()).split("\\.")[1];
if(value!=null && !"".equals(value)){
map.put(rowNum,value);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
/**
* 取出${}中的数据
* @param paramCode
* @return
*/
public String formatParamCode(String paramCode){
return paramCode.replaceAll("\\$", "").replaceAll("\\{", "").replaceAll("\\}", "");
}
/**
* 根据导出对象上的注解 PoiImportData 设置转换成对应的字典数据
*/
public void processingCodeData(List list, BaseToolMapper baseToolMapper) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
for (Object obj:list) {
Map describe = PropertyUtils.describe(obj);
for (String key : describe.keySet()) {
//排除掉默认的class
if(key.equals("class")){
continue;
}
if(describe.get(key) != null && !describe.get(key).toString().trim().equals("")){
//获取注解
PoiImportData annotation = obj.getClass().getDeclaredField(key).getAnnotation(PoiImportData.class);
if(annotation != null){
//表名
String tableName = annotation.tableName();
//主键
String id = annotation.id();
//value、
String value = annotation.value();
String s = baseToolMapper.selectCodeID(tableName, id, value, (String) describe.get(key));
BeanUtils.setProperty(obj,key,s);
}
}
}
}
}
public static void main(String[] ags) throws IllegalAccessException, Exception {
JxlsUtils jxlsUtils = new JxlsUtils("可移动文物标准模板.xls", 3);
try {
FileInputStream fileInputStream = new FileInputStream("D:\\青海项目\\各市州一普资料\\63232441900003河南蒙古族自治县拉卡寺.xls");
//导入
List list = (List)jxlsUtils.readPoiOfficeData(BaseRelic.class, fileInputStream);
//导出
jxlsUtils.exportExcel(list);
} catch (Exception e) {
e.printStackTrace();
}
// JxlsUtils jxlsUtils = new JxlsUtils();
// BaseRelic baseRelic = new BaseRelic();
// //baseRelic.setgId("11");
// boolean b = jxlsUtils.ifBenanNull(baseRelic);
// System.out.println(b);
}
}