这个工具类是是我在维护我们的项目导出功能的时候发现后台代码太臃肿了,重复的很多,于是自己根据jxl.jar包自己封装了导出方法,简化了java中Excel导出的繁琐操作,希望能帮助到需要实现导出功能的人,如果有什么疑问或者不懂得的可以留言给我.
说明:
这个工具类主要是针对将我们将数据库数据查询保存包实体类集合中,然后到处到Excel表中而实现的,目前实现导出的样式基本信息如下.
导出的样式就是这样,可以设置其实位置,是否需要编号列,指定显示列.
代码如下:
/**
* @文件名称: ExportUtil.java
* @类路径: com.shangbo.util
* @描述: TODO
* @作者:XieGang
* @时间:2018-6-9 下午10:10:57
* @版本:V1.5
*/
package com.sunboon.rbas.util.myutil;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.List;
import jxl.Cell;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.ScriptStyle;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
/**
* #### 导出工具类 ####
* ● 所属公司 : Sunboon
* ● 作者 : Xg
* ● 描述 : 此工具类用来简化导出操作,需要依赖导出jar包 jxl.jar,点击下载 :
* jxl.jar 密码:cx49
* 此工具类目前实现了一下方法:
1 自动设置列宽 ;2 设置标题头 ;3 字体和样式设置;4 创建表格
* ● 创建时间 : 2018-6-9 下午10:10:57
* ● 版本 : V1.0
*/
public class ExportUtils {
/**
* 根据实体类导出表格数据(注意参数columsName和参数fildGetStr的索引要一一对应,否则会出现数据错乱)
* @param filePath 文件路径/文件名.xls(xlsx)
* @param colNames 表格列标题数组(当第一列列名为编号或者序号的时候,会自动创建每一行数据的序号
* @param list 存有实体类数据的集合
* @param fieldGetStr 需要的实体类的get方法(当该参数为null或空的时候,为默认获取该实体类的所有属性对应的get方法)
*
* @方法说明 该方法封装了通过实体类的方式导出数据,使用示例:
* List<实体类> list = riskWarnDao.getAuthTellerFhList(params);
* String[] columsName = {"字段1","字段2","字段3","字段5","字段7"};
* String[] fildGetStr = {"字段1在实体类中的get方法名","字段2在实体类中的get方法名","字段3在实体类中的get方法名","字段5在实体类中的get方法名","字段7在实体类中的get方法名"};
* //说明:get方法名不包含括号部分,如name 的get方法:
* //private String name;
* //public string getName(){....}
* //get方法名为:getName
* String excelName = new ExportUtils<实体类>().createExcel("D:/"+fileName, columsName, list,fildGetStr);
*
* @最后更新 2019-06-28
* @作者 xiegang
* @return
*/
public String createExcel(String filePath, String[] colNames, List list,String[] fieldGetStr) {
//处理标题
String title = filePath.substring(filePath.lastIndexOf(File.separator)+1);
String sheetName = title.substring(0,title.lastIndexOf("."));
if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx")){
return "创建Excel文件:"+title+"失败,具体原因:文件名不是以\".xls\"或\".xlsx\"结尾";
}
WritableWorkbook workbook = null;
WritableSheet sheet = null;
//开始处理数据
try {
//创建工作簿对象
workbook = Workbook.createWorkbook(new File(filePath));
//创建一个sheet页面
sheet = workbook.createSheet(sheetName, 0);
//初始化列标题样式
WritableCellFormat thFormat = getCellFormat("等线", 12,true);
thFormat.setBackground(Colour.GREY_25_PERCENT);// 设置单元格的背景颜色
thFormat.setAlignment(Alignment.CENTRE); // 设置对齐方式
thFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框
// 添加列标题
int col = colNames[0].equals("编号") || colNames[0].equals("序号") ? 1 : 0;//开始列
int row = 0;//开始行
for(int i=0;i list, String[] fieldGetStr) {
if(fieldGetStr == null || fieldGetStr.length == 0){
T t = list.get(0); //一个T代表一个实体对象
Field[] fields = null;
String field = null;
//未自定义实体类属性,默认获取全部属性
fields = t.getClass().getDeclaredFields();
fieldGetStr = new String[fields.length];
for(int j=0;j3){
//情况1 字段以is开头, 如: isStatus
if(Character.isUpperCase(field.charAt(2))){
fieldGetStr[j] = field;
}
}else{
//情况2 字段以is开头,但都是小写 如isboy == isIsboy
//情况3 字段不包含is 如:boy
fieldGetStr[j] = "is"+field.substring(0,1).toUpperCase()+field.substring(1);
}
}else{
fieldGetStr[j] = "get"+field.substring(0,1).toUpperCase()+field.substring(1);
}
}
}
return fieldGetStr;
}
/**
* 根据实体类导出表格数据注意参数columsName和参数fildGetStr的索引要一一对应,否则会出现数据错乱
* @param sDate 开始日期(不需要的时候设置为null或者"")
* @param eDate 结束日期(只有开始日期存在得时候才生效
* @param filePath 文件路径/文件名.xls(xlsx)
* @param colNames 表格列标题数组(当第一列列名为编号或者序号的时候,会自动创建每一行数据的序号
* @param list 存有实体类数据的集合
* @param fieldGetStr 需要的实体类的get方法(当该参数为null或空的时候,为默认获取该实体类的所有属性对应的get方法)
*
* @方法说明 该方法封装了通过实体类的方式导出数据,使用示例:
* List<实体类> list = riskWarnDao.getAuthTellerFhList(params);
* String[] columsName = {"字段1","字段2","字段3","字段5","字段7"};
* String[] fildGetStr = {"字段1在实体类中的get方法名","字段2在实体类中的get方法名","字段3在实体类中的get方法名","字段5在实体类中的get方法名","字段7在实体类中的get方法名"};
* //说明:get方法名不包含括号部分,如name 的get方法:
* //private String name;
* //public string getName(){....}
* //get方法名为:getName
* String excelName = new ExportUtils<实体类>().createExcel(startDate,endDate,"D:/"+fileName, columsName, list,fildGetStr);
*
* @最后更新 2019-06-28
* @作者 xiegang
* @return
*/
public String createExcel(String sDate,String eDate,String filePath,String[] colNames, List list,String[] fieldGetStr){
//处理标题
String title = filePath.substring(filePath.lastIndexOf(File.separator)+1);
String sheetName = title.substring(0,title.lastIndexOf("."));
String date = null;
if(sDate != null && sDate.length() > 0){
String separation = "-";
if(!sDate.matches("^\\d*$"))separation = "/";
date = "日期:"+sDate+separation+eDate;
}
if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx")){
return "创建Excel文件:"+title+"失败,具体原因:文件名不是以\".xls\"或\".xlsx\"结尾";
}
WritableWorkbook workbook = null;
WritableSheet sheet = null;
//开始处理数据
try {
//创建工作簿对象
workbook = Workbook.createWorkbook(new File(filePath));
//创建一个sheet页面
sheet = workbook.createSheet(sheetName, 0);
//初始化列标题样式
WritableCellFormat thFormat = getCellFormat("等线", 12,true);
thFormat.setBackground(Colour.GREY_25_PERCENT);// 设置单元格的背景颜色
thFormat.setAlignment(Alignment.CENTRE); // 设置对齐方式
thFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框
// 添加列标题
int col = colNames[0].equals("编号") || colNames[0].equals("序号") ? 1 : 0;//开始列
int row = 0;//开始行
for(int i=0;i根据查询的列名生产Excel表格,不需要实体类
说明:该方法适用于List<Map<key, value>>集合
* String createExcel(String 开始日期,String 结束日期,String 文件存放路径.xls,List<LinkedHashMap<String, Object>> 待导出的数据,
String[] 列别名,String[] 数据库对应列名)
* @描述 此方法实现了直接封装数据库查询的数据到Excel表格中,中间去掉了实体类的创建.使用的时候
* 需要注意的是数据库列名最好大写使用示例:
* List<LinkedHashMap<String,Object>> list = fh.getAllFhInfo();
* String[] colNames ={"序号","交易码","复核率","复核员","创建时间","修改时间"};
* String[] valNames ={"TRADECODE","FHPERCENT","FHUSERCODE","CREATETIME","UPDATETIME"};
* String string = ExportUtils.createExcel(null, null, "D:/交易信息表.xls", list, colNames, valNames);
* @作者 XieGang
* @创建时间 2018-9-4
* @更新时间 2019-06-28
* @param strDate 开始日期,不需要的话填null
* @param endDate 结束日期,开始日期为null,该字段就无意义
* @param filePath 存放Excel文件的路径
* @param list 待封装到表格的数据集合
* @param colNames 列别名数组(每列叫什么名字)
* @param valNames 查询的sql中的列名数组(推荐都大写)
* @return Excel文件名
*/
public static String createExcel(String strDate, String endDate, String filePath, List> list, String[] colNames, String[] valNames) {
//处理标题
String title = filePath.substring(filePath.lastIndexOf(File.separator)+1);
String sheetName = title.substring(0,title.lastIndexOf("."));
String date = null;
if(strDate != null && strDate.length() > 0){
String separation = "-";
if(!strDate.matches("^\\d*$"))separation = "/";
date = "日期:"+strDate+separation+endDate;
}
if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx")){
return "创建Excel文件:"+title+"失败,具体原因:文件名不是以\".xls\"或\".xlsx\"结尾";
}
WritableWorkbook workbook = null;
WritableSheet sheet = null;
//开始处理数据
try {
//创建工作簿对象
workbook = Workbook.createWorkbook(new File(filePath));
//创建一个sheet页面
sheet = workbook.createSheet(sheetName, 0);
//初始化列标题样式
WritableCellFormat thFormat = getCellFormat("等线", 12,true);
thFormat.setBackground(Colour.GREY_25_PERCENT);// 设置单元格的背景颜色
thFormat.setAlignment(Alignment.CENTRE); // 设置对齐方式
thFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框
// 添加列标题
int col = colNames[0].equals("编号") || colNames[0].equals("序号") ? 1 : 0;//开始列
int row = 0;//开始行
for(int i=0;i tr = null;
String td = null;
for(int i=0;i● getCellFormat(
* 字体名称,字体大小,是否粗体 ):WritableCellFormat -- MyStringUtils
● 描述:
* 得到一个表格单元格格式化对象WritableCellFormat
● 描述:
* 调用此方法可以得到一个单元格格式化对象WritableCellFormat,可以设置字体大小和字体名称和是否设置字体为粗体
● 返回值: WritableCellFormat
* @param fontName 字体名称
* @param fontSize 字体大小
* @param isBold 是否为粗体
* @return WritableCellFormat对象
*/
public static WritableCellFormat getCellFormat(String fontName,int fontSize,boolean isBold){
//1 创建一个字体对象
WritableFont font = new WritableFont(
WritableFont.createFont(fontName), //字体
fontSize, //字号
isBold ?WritableFont.BOLD: WritableFont.NO_BOLD, //是否粗体 WritableFont.BOLD 是 WritableFont.NO_BOLD 否
false, //是否斜体 ture 是,false 否
UnderlineStyle.NO_UNDERLINE,//是否需要下滑线 UnderlineStyle.NO_UNDERLINE 不需要 UnderlineStyle.UNDERLINE 需要
Colour.BLACK,//字体颜色
ScriptStyle.NORMAL_SCRIPT);
//2 创建一个WritableCellFormat对象 并返回
return new WritableCellFormat(font);
}
/**
* ● getCellFormat(
* 字体名称,字体大小,是否粗体,是否斜体 ):WritableCellFormat -- MyStringUtils
● 描述:
* 得到一个表格单元格格式化对象WritableCellFormat
● 描述:
* 调用此方法可以得到一个单元格格式化对象WritableCellFormat,可以设置字体大小和字体名称和是否设置字体为粗体和设置字体是否为斜体
● 返回值: WritableCellFormat
* @param isItalic 是否为斜体
* @param fontName 字体名称
* @param fontSize 字体大小
* @param isBold 是否为粗体
* @return WritableCellFormat对象
*/
public static WritableCellFormat getCellFormat(String fontName,int fontSize,boolean isBold,boolean isItalic){
//1 创建一个字体对象
WritableFont font = new WritableFont(
WritableFont.createFont(fontName), //字体
fontSize, //字号
isBold ? WritableFont.BOLD: WritableFont.NO_BOLD, //是否粗体 WritableFont.BOLD 是 WritableFont.NO_BOLD 否
isItalic, //是否斜体 ture 是,false 否
UnderlineStyle.NO_UNDERLINE,//是否需要下滑线 UnderlineStyle.NO_UNDERLINE 不需要 UnderlineStyle.UNDERLINE 需要
Colour.BLACK,//字体颜色
ScriptStyle.NORMAL_SCRIPT);
//2 创建一个WritableCellFormat对象 并返回
return new WritableCellFormat(font);
}
/**
* ● getCellFormat(
* 字体名称,字体大号,是否粗体,是否斜体,是否下划线 ):WritableCellFormat -- MyStringUtils
● 描述:
* 得到一个表格单元格格式化对象WritableCellFormat
● 描述:
* 调用此方法可以得到一个单元格格式化对象WritableCellFormat,可以设置字体大小和字体名称和是否设置字体为粗体和设置字体是否为斜体和设置字体是否有下划线
● 返回值: WritableCellFormat
* @param isItalic 是否为斜体
* @param fontName 字体名称
* @param fontSize 字体大小
* @param isBold 是否为粗体
* @param isUnderLine 是否下划线
* @return WritableCellFormat对象
*/
public static WritableCellFormat getCellFormat(String fontName,int fontSize,boolean isBold,boolean isItalic,boolean isUnderLine){
//1 创建一个字体对象
WritableFont font = new WritableFont(
WritableFont.createFont(fontName), //字体
fontSize, //字号
isBold ? WritableFont.BOLD: WritableFont.NO_BOLD, //是否粗体 WritableFont.BOLD 是 WritableFont.NO_BOLD 否
isItalic, //是否斜体 ture 是,false 否
isUnderLine? UnderlineStyle.DOUBLE:UnderlineStyle.NO_UNDERLINE,//是否需要下滑线 UnderlineStyle.NO_UNDERLINE 不需要 UnderlineStyle.UNDERLINE 需要
Colour.BLACK,//字体颜色
ScriptStyle.NORMAL_SCRIPT);
//2 创建一个WritableCellFormat对象 并返回
return new WritableCellFormat(font);
}
/**
* ● createTitle(
* 文件名,表格sheet对象,开始列,插入行,待合并列数 ):void -- MyStringUtils
● 描述:
* 在Excel中创建表格标题
● 描述:
* 在Excel中创建表格标题,可以指定在(x,y)处开始创建表格标题,其中 totalColums是需要合并的列数
* 示例:在excel表格坐标(5,6)指定位置创建表格,然后,合并5列 标题名是:textName
参数对应的就是:
* startColum=5;insertRow=6;totalColums= 5;fileName=textName
● 返回值: void
* @param fileName 文件标题名
* @param sheet 表格页面对象
* @param startColum 开始列
* @param startRow 待新增行的行坐标
* @param totalColums 需要合并的列数
* @throws Exception WriteException和RowsExceededException
*/
public static void createTitle(String fileName,WritableSheet sheet,int startColum,int startRow,int totalColums) throws Exception{
sheet.insertRow(startRow == 0?0:startRow);
//设置标题字体
WritableCellFormat cellFormat = getCellFormat("仿宋", 16, true);
//居中显示
cellFormat.setAlignment(Alignment.CENTRE);
//添加进指定位置单元格
// System.out.println("startColum"+startColum+",startRow"+startRow);
sheet.addCell(new Label(startColum,startRow, fileName));
//得到需要操作的单元格
WritableCell cell = sheet.getWritableCell(startColum,startRow);
//设置字体和样式
cell.setCellFormat(cellFormat);
/*合并单元格
方法 WritableSheet.mergeCells(int m,int n,int p,int q);
作用是从(m,n)到(p,q)的单元格全部合并[我的理解:m列、n行和p列、q行合并]
示例:sheet.mergeCells(0, 0, 0, 1);//设置第一列、第一行和 第一列、第二行合并*/
//合并当前行第insertRow列到insertRow+totalColums列.
sheet.mergeCells(startColum, startRow, startColum+totalColums, startRow);
}
/**
* 自动根据内容设置列宽,保证每列都能完全显示内容
* autoSetCell( Integer 开始列, Integer 从开始列需要设置的列数,WritableSheet WritableSheet对象)
* @param colStart 开始列
* @param colTotal 从开始列需要设置的列数
* @param sheet WritableSheet对象
* @throws UnsupportedEncodingException
* @描述 这是一个自动设置导出表格单元格的方法,单元格最小宽度是63px,当列的内容超出最小宽度的时候,才会自动设置宽度
* @作者 XieGang
* @创建时间 2018年9月4日
*/
public static void autoSetCell( Integer colStart, Integer colTotal,WritableSheet sheet) throws UnsupportedEncodingException {
int maxWidth = 0;
Cell[] columns = null;
for (int i = colStart; i < (colStart + colTotal); i++) {
// 获取当前列的内容
columns = sheet.getColumn(i);
// 遍历,找到内容最长的列的宽度
for (Cell cell : columns) {
int n = cell.getContents().getBytes("gbk").length;
if (maxWidth <= n) {
maxWidth = n + 2;
}
// System.err.println(cell.getContents() + ":" + cell.getContents().length());
}
// 设置单元格列宽
maxWidth = maxWidth < 9 ? 9 : maxWidth;
sheet.setColumnView(i, maxWidth);
// 重置最大列宽
maxWidth = 9;
}
}
/**
*
* int getWordCount()
* @param s
* @return
* @描述 TODO()
* @作者 XieGang
* @创建时间 2018-9-29
*/
public int getWordCount(String s){
s = s.replaceAll("[^\\x00-\\xff]", "**");
int length = s.length();
return length;
}
}