Commit b37012ca by 王仕雄

excel解析相关工具类与测试方法

1 parent f898ceb8
...@@ -238,6 +238,24 @@ ...@@ -238,6 +238,24 @@
<version>1.9.2</version> <version>1.9.2</version>
</dependency> </dependency>
<!--jxl jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Excel文档-->
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
<!--war包部署需要--> <!--war包部署需要-->
<!--<dependency>--> <!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>--> <!--<groupId>org.springframework.boot</groupId>-->
......
package com.bootdo.common.utils;
public class AAA {
public static void main(String[] args) {
String ids ="[380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409]";
String answers ="[B不同意, ['C脱敏治疗','B提高免疫力','A 避免接触过敏原'], B不同意, ['卡托普利','赖诺普利片','苯磺酸氨氯地平片','珍菊降压片','氢氯噻嗪'], ['泮托拉唑','奥美拉唑','兰索拉唑','氢氧化铝片'], ['容易引发脑溢血','长期高血压导致肾衰竭','容易导致动脉粥样硬化','长期高血压导致冠心病'], ['晕车贴','晕车药','坐车前不吃东西','吸闻橘子皮预防晕车'], ['不得掰开使用','服用时不能咀嚼'], ['鼻塞','鼻痒','流涕','喷嚏','慢性荨麻疹','皮肤瘙痒','哮喘','面部红斑','过敏性结膜炎'], ['氯雷他定','扑尔敏片'], ['肥胖','吸烟','饮酒','缺乏运动','高血压病家族遗传史','老年人','怀孕的妇女','食盐摄入量大的人','饮食过于油腻的人'], ['抗酸剂','抑酸剂','粘膜保护剂'], ['厌食','营养不良','身体消瘦','肠梗阻及穿孔','智力发育障碍','荨麻疹','哮喘'], ['接触患有肠道寄生虫病的患者',]";
String []s = ids.split(",");
String []s2 = answers.split(",");
String a2 = "B不同意@|,['B提高免疫力']@|,B不同意@|,['苯磺酸氨氯地平片','珍菊降压片','氢氯噻嗪']@|,['兰索拉唑','奥美拉唑']@|,['容易导致动脉粥样硬化','长期高血压导致冠心病']@|,['坐车前不吃东西']@|,['其他','服用时不能咀嚼']@|,['鼻痒','慢性荨麻疹','喷嚏','过敏性结膜炎']@|,['康必得','氯雷他定','扑尔敏片']@|,['饮酒','缺乏运动','食盐摄入量大的人']@|,['促胃肠动力药','粘膜保护剂']@|,['身体消瘦','肠梗阻及穿孔']@|,['接触被污染的玩具','接触被污染的地板']@|,['定期服用驱虫药','瓜果蔬菜洗净吃']@|,['阿苯达唑片','其他']@|,['男性性功能障碍']@|,['海鲜','紫外线','动物皮毛']@|,['失眠','耳鸣','头晕']@|,['B降压药不能随便吃,一旦吃了就断不了','D降压药有副作用,尽量不使用降压药']@|,['B电视广告','D药店服务人员介绍','F听别人介绍']@|,['C不好,没什么效果,反而嗜睡等副作用很大 对我没";
String [] a22 = a2.split("[@][|],");
System.out.println(99);
}
}
package com.bootdo.common.utils;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
public class ExcelUtilTest {
public static void main(String[] args) throws Exception {
InputStream in = new FileInputStream("d://12348.xls");
Map<String, String> fieldd = new HashMap<String, String>();
fieldd.put("ids", "ids");
fieldd.put("titles", "titles");
fieldd.put("answers", "answers");
List<HzdyDO> resultList = new ArrayList<HzdyDO>();
resultList = ExeclUtil.ExecltoList(in, HzdyDO.class, fieldd);
List<Integer> idLength = new ArrayList<Integer>();
List<Integer> titleLength = new ArrayList<Integer>();
List<Integer> answerLength = new ArrayList<Integer>();
for(HzdyDO hzdyDO:resultList) {
idLength.add(hzdyDO.getIds().split("[@][|],").length);
titleLength.add(hzdyDO.getTitles().split("[@][|],").length);
answerLength.add(hzdyDO.getAnswers().split("[@][|],").length);
}
//id与title对比
for(int i=0;i<idLength.size();i++) {
if(idLength.get(i).intValue() != titleLength.get(i).intValue()) {
System.out.println("第"+i+1+"条数据的id与title长度不匹配");
break;
}
if(idLength.get(i).intValue() != answerLength.get(i).intValue()) {
System.out.println("第"+i+1+"条数据的id与answer长度不匹配");
break;
}
}
//对查询结果中的题目id,题目文本,用户答案进行拆分
List<Map<String, Object>> finalDataList = new ArrayList<Map<String,Object>>();
for(int i=0;i<10;i++) {
Map finalMap = new HashMap<String, Object>();
finalMap.put("enterpriseName", i+"a");//乙方企业
finalMap.put("projectName", i+"b");//项目名称
finalMap.put("taskDt", i+"c");//任务月度
finalMap.put("fullName", i+"d");//答题人姓名
finalMap.put("phone", i+"e");//答题人手机号
finalMap.put("createDt", i+"f");//答题时间
finalMap.put("audit_status", i+"g");//状态
String topicIds = String.valueOf(resultList.get(i).getIds());//用户答题的,题目id数组, 与问卷标准的id数组可能不匹配,但与用户答题的题目文本,题目答案数组是匹配的
topicIds = topicIds.substring(0, topicIds.length()-2);
String topicTitles = String.valueOf(resultList.get(i).getTitles());//用户答题的,题目文本数组
topicTitles = topicTitles.substring(0,topicTitles.length()-2);
String topicAnswers = String.valueOf(resultList.get(i).getAnswers());//用户答题的,题目答案数组
topicAnswers = topicAnswers.substring(0,topicAnswers.length()-2);
List<String> topicIdList = new ArrayList<String>();//当前问卷应该存在的题目id 问卷的标准id数组
String [] topicIdArr = topicIds.split("[@][|],");
String [] topicTitleArr = topicTitles.split("[@][|],");
String [] topicAnswerArr = topicAnswers.split("[@][|],");
for(int j=0;j<topicIdArr.length;j++) {
finalMap.put(topicIdArr[j], topicAnswerArr[j]);
}
finalDataList.add(finalMap);
}
//设置报表名字
String fileName="医学调研任务报表新";
//设置分页名称
String sheetName="医学调研任务记录新";
//设置报表1表头
String [] columns = {"乙方企业","项目名称","任务月度","项目参与人","手机号","填写时间","状态"};
//状态单独处理
String statusRemark = "audit_status|1:审核中|2:审核通过|3:审核不通过|其他";
//设置报表从map中获取的key,必须与表头长度对应
String [] columnKeys = {"enterpriseName","projectName","taskDt","fullName","phone","createDt",statusRemark};
//增加表头,增加key 表头为题目的title ,key为题目的id
List<String> columnArr = new ArrayList<String>(Arrays.asList(columns));
List<String> columnKeyArr = new ArrayList<String>(Arrays.asList(columnKeys));
String [] topicIdArr = resultList.get(0).getIds().split("[@][|],");
String [] topicTitleArr = resultList.get(0).getTitles().split("[@][|],");
for(int j=0;j<topicIdArr.length;j++) {
columnArr.add(String.valueOf(topicTitleArr[j]));
columnKeyArr.add(String.valueOf(topicIdArr[j]));
}
String[] columnsV2 = new String[columnArr.size()];
String[] columnKeysV2 = new String[columnKeyArr.size()];
columnArr.toArray(columnsV2);
columnKeyArr.toArray(columnKeysV2);
//第一个excel表格
JxlExcelUtils.exportOwoSheetExcleFinal(null, fileName, finalDataList,sheetName, columnsV2, columnKeysV2);
System.out.println(999);
}
}
package com.bootdo.common.utils;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
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;
public class ExeclUtil {
static int sheetsize = 5000;
/**
* @author Lyy
* @param data
* 导入到excel中的数据
* @param out
* 数据写入的文件
* @param fields
* 需要注意的是这个方法中的map中:每一列对应的实体类的英文名为键,excel表格中每一列名为值
* @throws Exception
*/
public static <T> void ListtoExecl(List<T> data, OutputStream out,
Map<String, String> fields) throws Exception {
HSSFWorkbook workbook = new HSSFWorkbook();
// 如果导入数据为空,则抛出异常。
if (data == null || data.size() == 0) {
workbook.close();
throw new Exception("导入的数据为空");
}
// 根据data计算有多少页sheet
int pages = data.size() / sheetsize;
if (data.size() % sheetsize > 0) {
pages += 1;
}
// 提取表格的字段名(英文字段名是为了对照中文字段名的)
String[] egtitles = new String[fields.size()];
String[] cntitles = new String[fields.size()];
Iterator<String> it = fields.keySet().iterator();
int count = 0;
while (it.hasNext()) {
String egtitle = (String) it.next();
String cntitle = fields.get(egtitle);
egtitles[count] = egtitle;
cntitles[count] = cntitle;
count++;
}
// 添加数据
for (int i = 0; i < pages; i++) {
int rownum = 0;
// 计算每页的起始数据和结束数据
int startIndex = i * sheetsize;
int endIndex = (i + 1) * sheetsize - 1 > data.size() ? data.size()
: (i + 1) * sheetsize - 1;
// 创建每页,并创建第一行
HSSFSheet sheet = workbook.createSheet();
HSSFRow row = sheet.createRow(rownum);
// 在每页sheet的第一行中,添加字段名
for (int f = 0; f < cntitles.length; f++) {
HSSFCell cell = row.createCell(f);
cell.setCellValue(cntitles[f]);
}
rownum++;
// 将数据添加进表格
for (int j = startIndex; j < endIndex; j++) {
row = sheet.createRow(rownum);
T item = data.get(j);
for (int h = 0; h < cntitles.length; h++) {
Field fd = item.getClass().getDeclaredField(egtitles[h]);
fd.setAccessible(true);
Object o = fd.get(item);
String value = o == null ? "" : o.toString();
HSSFCell cell = row.createCell(h);
cell.setCellValue(value);
}
rownum++;
}
}
// 将创建好的数据写入输出流
workbook.write(out);
// 关闭workbook
workbook.close();
}
/**
  * @author Lyy
  * @param entityClass excel中每一行数据的实体类
  * @param in excel文件
  * @param fields 字段名字
  * 需要注意的是这个方法中的map中:
  * excel表格中每一列名为键,每一列对应的实体类的英文名为值
   * @throws Exception
  */
public static <T> List<T> ExecltoList(InputStream in, Class<T> entityClass,
Map<String, String> fields) throws Exception {
List<T> resultList = new ArrayList<T>();
HSSFWorkbook workbook = new HSSFWorkbook(in);
// excel中字段的中英文名字数组
String[] egtitles = new String[fields.size()];
String[] cntitles = new String[fields.size()];
Iterator<String> it = fields.keySet().iterator();
int count = 0;
while (it.hasNext()) {
String cntitle = (String) it.next();
String egtitle = fields.get(cntitle);
egtitles[count] = egtitle;
cntitles[count] = cntitle;
count++;
}
// 得到excel中sheet总数
int sheetcount = workbook.getNumberOfSheets();
if (sheetcount == 0) {
workbook.close();
throw new Exception("Excel文件中没有任何数据");
}
// 数据的导出
for (int i = 0; i < sheetcount; i++) {
HSSFSheet sheet = workbook.getSheetAt(i);
if (sheet == null) {
continue;
}
// 每页中的第一行为标题行,对标题行的特殊处理
HSSFRow firstRow = sheet.getRow(0);
int celllength = firstRow.getLastCellNum();
String[] excelFieldNames = new String[celllength];
LinkedHashMap<String, Integer> colMap = new LinkedHashMap<String, Integer>();
// 获取Excel中的列名
for (int f = 0; f < celllength; f++) {
HSSFCell cell = firstRow.getCell(f);
excelFieldNames[f] = cell.getStringCellValue().trim();
// 将列名和列号放入Map中,这样通过列名就可以拿到列号
for (int g = 0; g < excelFieldNames.length; g++) {
colMap.put(excelFieldNames[g], g);
}
}
// 由于数组是根据长度创建的,所以值是空值,这里对列名map做了去空键的处理
colMap.remove(null);
// 判断需要的字段在Excel中是否都存在
// 需要注意的是这个方法中的map中:中文名为键,英文名为值
boolean isExist = true;
List<String> excelFieldList = Arrays.asList(excelFieldNames);
for (String cnName : fields.keySet()) {
if (!excelFieldList.contains(cnName)) {
isExist = false;
break;
}
}
// 如果有列名不存在,则抛出异常,提示错误
if (!isExist) {
workbook.close();
throw new Exception("Excel中缺少必要的字段,或字段名称有误");
}
// 将sheet转换为list
for (int j = 1; j <= sheet.getLastRowNum(); j++) {
HSSFRow row = sheet.getRow(j);
// 根据泛型创建实体类
T entity = entityClass.newInstance();
// 给对象中的字段赋值
for (Entry<String, String> entry : fields.entrySet()) {
// 获取中文字段名
String cnNormalName = entry.getKey();
// 获取英文字段名
String enNormalName = entry.getValue();
// 根据中文字段名获取列号
int col = colMap.get(cnNormalName);
// 获取当前单元格中的内容
String content = row.getCell(col).toString().trim();
// 给对象赋值
setFieldValueByName(enNormalName, content, entity);
}
resultList.add(entity);
}
}
workbook.close();
return resultList;
}
/**
* @MethodName : setFieldValueByName
* @Description : 根据字段名给对象的字段赋值
* @param fieldName
* 字段名
* @param fieldValue
* 字段值
* @param o
* 对象
*/
private static void setFieldValueByName(String fieldName,
Object fieldValue, Object o) throws Exception {
Field field = getFieldByName(fieldName, o.getClass());
if (field != null) {
field.setAccessible(true);
// 获取字段类型
Class<?> fieldType = field.getType();
// 根据字段类型给字段赋值
if (String.class == fieldType) {
field.set(o, String.valueOf(fieldValue));
} else if ((Integer.TYPE == fieldType)
|| (Integer.class == fieldType)) {
field.set(o, Integer.parseInt(fieldValue.toString()));
} else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) {
field.set(o, Long.valueOf(fieldValue.toString()));
} else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) {
field.set(o, Float.valueOf(fieldValue.toString()));
} else if ((Short.TYPE == fieldType) || (Short.class == fieldType)) {
field.set(o, Short.valueOf(fieldValue.toString()));
} else if ((Double.TYPE == fieldType)
|| (Double.class == fieldType)) {
field.set(o, Double.valueOf(fieldValue.toString()));
} else if (Character.TYPE == fieldType) {
if ((fieldValue != null)
&& (fieldValue.toString().length() > 0)) {
field.set(o,
Character.valueOf(fieldValue.toString().charAt(0)));
}
} else if (Date.class == fieldType) {
field.set(o, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.parse(fieldValue.toString()));
} else {
field.set(o, fieldValue);
}
} else {
throw new Exception(o.getClass().getSimpleName() + "类不存在字段名 "
+ fieldName);
}
}
/**
* @MethodName : getFieldByName
* @Description : 根据字段名获取字段
* @param fieldName
* 字段名
* @param clazz
* 包含该字段的类
* @return 字段
*/
private static Field getFieldByName(String fieldName, Class<?> clazz) {
// 拿到本类的所有字段
Field[] selfFields = clazz.getDeclaredFields();
// 如果本类中存在该字段,则返回
for (Field field : selfFields) {
if (field.getName().equals(fieldName)) {
return field;
}
}
// 否则,查看父类中是否存在此字段,如果有则返回
Class<?> superClazz = clazz.getSuperclass();
if (superClazz != null && superClazz != Object.class) {
return getFieldByName(fieldName, superClazz);
}
// 如果本类和父类都没有,则返回空
return null;
}
}
package com.bootdo.common.utils;
public class HzdyDO {
String ids;
String titles;
String answers;
public String getIds() {
return ids;
}
public void setIds(String ids) {
this.ids = ids;
}
public String getTitles() {
return titles;
}
public void setTitles(String titles) {
this.titles = titles;
}
public String getAnswers() {
return answers;
}
public void setAnswers(String answers) {
this.answers = answers;
}
}
package com.bootdo.common.utils;
/**
* Created with IntelliJ IDEA.
* User: GRAND-CQU-RD001
* Date: 14-5-8
* Time: 上午10:31
* To change this template use File | Settings | File Templates.
*/
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
import jxl.CellView;
import jxl.SheetSettings;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
/**
* jxl导出excel
* @author jamboree
* @date 2013-11-28
*/
public class JxlExcelUtils {
/**--------------exportExcel2
* @author
* @param objData1 导出内容数组
* @param sheetName1 导出工作表的名称
* @param columns1 导出Excel的表头数组
* @return
*/
public static int exportExcel2(
HttpServletResponse response,
List<Map<String, Object>> objData1, String sheetName1,List<String> columns1,
List<Map<String, Object>> objData2, String sheetName2,List<String> columns2
) {
int flag = 0;
//声明工作簿jxl.write.WritableWorkbook
WritableWorkbook wwb;
try {
//根据传进来的file对象创建可写入的Excel工作薄
OutputStream os = response.getOutputStream();
wwb = Workbook.createWorkbook(os);
/*
* 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
* 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
* 代码中的"0"就是sheet1、其它的一一对应。
* createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
WritableSheet ws1 = wwb.createSheet(sheetName1, 0);
WritableSheet ws2 = wwb.createSheet(sheetName2, 1);
SheetSettings ss1 = ws1.getSettings();
ss1.setVerticalFreeze(1);//冻结表头
SheetSettings ss2 = ws2.getSettings();
ss2.setVerticalFreeze(1);//冻结表头
CellView cellView = new CellView();
cellView.setAutosize(true); //设置自动大小
//创建单元格样式
WritableFont font1 = new WritableFont(WritableFont.createFont("微软雅黑"), 10 ,WritableFont.BOLD);
WritableFont font2 = new WritableFont(WritableFont.createFont("微软雅黑"), 9 ,WritableFont.NO_BOLD);
WritableCellFormat wcf1 = new WritableCellFormat(font1);
WritableCellFormat wcf2 = new WritableCellFormat(font2); //设置样式,字体
//背景颜色
wcf1.setAlignment(Alignment.CENTRE); //平行居中
wcf1.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
wcf1.setBackground(Colour.GRAY_25);
wcf2.setAlignment(Alignment.CENTRE); //平行居中
wcf2.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
// wcf2.setBackground(Colour.LIGHT_ORANGE);
//判断一下表头数组是否有数据 写入sheet1数据
if (columns1 != null && columns1.size() > 0) {
//循环写入表头
for (int i = 0; i < columns1.size(); i++) {
/*
* 添加单元格(Cell)内容addCell()
* 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型
* 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
* Label(i, 0, columns[i], wcf)
* 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
//根据内容自动设置列宽
ws1.setColumnView(i, new String("空格"+columns1.get(i)+"空格").length());
ws1.addCell(new Label(i, 0, columns1.get(i), wcf1));
}
//判断表中是否有数据
if (objData1 != null && objData1.size() > 0) {
//循环写入表中数据
for (int i = 0; i < objData1.size(); i++) {
//转换成map集合{activyName:测试功能,count:2}
Map<String, Object> map = (Map<String, Object>)objData1.get(i);
//循环输出map中的子集:既列值
int j=0;
for(Object o:map.keySet()){
//ps:因为要“”通用”“导出功能,所以这里循环的时候不是get("Name"),而是通过map.get(o)
//根据内容自动设置列宽
int columnSize = new String("空格"+map.get(o)+"空格").length()<8?8:new String("空格"+map.get(o)+"空格").length();
ws1.setColumnView(j, columnSize);
ws1.addCell(new Label(j,i+1,(String.valueOf(map.get(o))==null||"null".equals(String.valueOf(map.get(o))))?"--":String.valueOf(map.get(o)),wcf2));
j++;
}
}
}else{
flag = -1;
}
}
//判断一下表头数组是否有数据 写入sheet2数据
if (columns2 != null && columns2.size() > 0) {
//循环写入表头
for (int i = 0; i < columns2.size(); i++) {
/*
* 添加单元格(Cell)内容addCell()
* 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型
* 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
* Label(i, 0, columns[i], wcf)
* 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
//根据内容自动设置列宽
ws2.setColumnView(i, new String("空格"+columns2.get(i)+"空格").length());
ws2.addCell(new Label(i, 0, columns2.get(i), wcf1));
}
//判断表中是否有数据
if (objData2 != null && objData2.size() > 0) {
//循环写入表中数据
for (int i = 0; i < objData2.size(); i++) {
//转换成map集合{activyName:测试功能,count:2}
Map<String, Object> map = (Map<String, Object>)objData2.get(i);
//循环输出map中的子集:既列值
int j=0;
for(Object o:map.keySet()){
//ps:因为要“”通用”“导出功能,所以这里循环的时候不是get("Name"),而是通过map.get(o)
//根据内容自动设置列宽
int columnSize = new String("空格"+map.get(o)+"空格").length()<8?8:new String("空格"+map.get(o)+"空格").length();
ws2.setColumnView(j, columnSize);
ws2.addCell(new Label(j,i+1,String.valueOf(map.get(o)),wcf2));
j++;
}
}
}else{
flag = -1;
}
}
//写入Exel工作表
wwb.write();
//关闭Excel工作薄对象
wwb.close();
//关闭流
os.flush();
os.close();
os =null;
}catch (IllegalStateException e) {
System.err.println(e.getMessage());
}
catch (Exception ex) {
flag = 0;
ex.printStackTrace();
}
return flag;
}
/**
* 下载excel------2
* @author
* @param response
* @param filename 文件名 ,如:20110808.xls
* @param listData1 数据源
* @param sheetName1 表头名称
* @param columns1 列名称集合,如:{物品名称,数量,单价}
*/
public static void exportTwoSheetExcle(
HttpServletResponse response,
String filename,
List<Map<String, Object>> listData1,String sheetName1,List<String> columns1,
List<Map<String, Object>> listData2,String sheetName2,List<String> columns2
)
{
//调用上面的方法、生成Excel文件
response.setContentType("application/vnd.ms-excel");
//response.setHeader("Content-Disposition", "attachment;filename="+filename);
try {
response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1") + ".xls");
exportExcel2(response, listData1, sheetName1, columns1, listData2, sheetName2, columns2);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**
* 下载excel------1
* @author
* @param response
* @param filename 文件名 ,如:20110808.xls
* @param listData1 数据源
* @param sheetName1 表头名称
* @param columns1 列名称集合,如:{物品名称,数量,单价}
*/
public static void exportOwoSheetExcle(
HttpServletResponse response,
String filename,
List<Map<String, Object>> listData1,String sheetName1,List<String> columns1
)
{
//调用上面的方法、生成Excel文件
response.setContentType("application/vnd.ms-excel");
//response.setHeader("Content-Disposition", "attachment;filename="+filename);
try {
response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1") + ".xls");
exportExcel1(response, listData1, sheetName1, columns1);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**
*
* @param response
* @param filename 文件名
* @param listData 数据
* @param sheetName1 表格名
* @param columns 列数组
* @param columnKeys 列关键字数组
*
* 如下翻译处理,
* String statusRemark = "authStatus|1:审核中|2:审核通过|3:审核不通过|其他";
*
*/
public static void exportOwoSheetExcleFinal(
HttpServletResponse response,
String filename,
List<Map<String, Object>> listData,String sheetName,String [] columns,String [] columnKeys){
try {
List<String> columnNames = new ArrayList<String>();
for(String column:columns) {
columnNames.add(column);
}
List<Map<String, Object>> listDataFinal = new ArrayList<Map<String, Object>>();
for (int i = 0; i < listData.size(); i++) {
Map<String, Object> stringObjectMap = (Map<String, Object>)listData.get(i);
Map<String, Object> map1 = new LinkedHashMap<String, Object>();
for(int j=0;j<columnNames.size();j++) {
if(!StringUtils.isEmpty(columnKeys[j]) && columnKeys[j].contains("|")) {//有需要转换 翻译的列值
String [] colKeyStr = columnKeys[j].split("[|]");//第一个位置为key,最后一个为缺省值,中间为需要翻译的值
String colVal = String.valueOf(stringObjectMap.get(colKeyStr[0]));
String colValFinal = null;
for(int k=1;k<colKeyStr.length-1;k++) {
if(colKeyStr[k].split(":")[0].equals(colVal)){
colValFinal = colKeyStr[k].split(":")[1];
}
}
if(StringUtils.isEmpty(colValFinal)) {//如果未找到翻译值,就取最后一个
colValFinal = colKeyStr[colKeyStr.length-1];
}
map1.put(columnNames.get(j), colValFinal);
continue;
}
map1.put(columnNames.get(j), stringObjectMap.get(columnKeys[j]));
}
listDataFinal.add(map1);
}
JxlExcelUtils.exportOwoSheetExcle(response, filename, listDataFinal, sheetName, columnNames);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
/**-------exportExcel1
* @author
* @param objData1 导出内容数组
* @param sheetName1 导出工作表的名称
* @param columns1 导出Excel的表头数组
* @return
*/
public static int exportExcel1(HttpServletResponse response, List<Map<String, Object>> objData, String sheetName,List<String> columns) {
int flag = 0;
//声明工作簿jxl.write.WritableWorkbook
WritableWorkbook wwb;
try {
//根据传进来的file对象创建可写入的Excel工作薄
OutputStream os = response.getOutputStream();
wwb = Workbook.createWorkbook(os);
/*
* 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
* 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
* 代码中的"0"就是sheet1、其它的一一对应。
* createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
WritableSheet ws = wwb.createSheet(sheetName, 0);
SheetSettings ss = ws.getSettings();
ss.setVerticalFreeze(1);//冻结表头
CellView cellView = new CellView();
cellView.setAutosize(true); //设置自动大小
//创建单元格样式
WritableFont font1 = new WritableFont(WritableFont.createFont("微软雅黑"), 10 ,WritableFont.BOLD);
WritableFont font2 = new WritableFont(WritableFont.createFont("微软雅黑"), 9 ,WritableFont.NO_BOLD);
WritableCellFormat wcf1 = new WritableCellFormat(font1);
WritableCellFormat wcf2 = new WritableCellFormat(font2); //设置样式,字体
//背景颜色
wcf1.setAlignment(Alignment.CENTRE); //平行居中
wcf1.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
wcf1.setBackground(Colour.GRAY_25);
wcf2.setAlignment(Alignment.CENTRE); //平行居中
wcf2.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
// wcf2.setBackground(Colour.LIGHT_ORANGE);
//判断一下表头数组是否有数据
if (columns != null && columns.size() > 0) {
//循环写入表头
for (int i = 0; i < columns.size(); i++) {
/*
* 添加单元格(Cell)内容addCell()
* 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型
* 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
* Label(i, 0, columns[i], wcf)
* 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
//根据内容自动设置列宽
ws.setColumnView(i, new String("空格"+columns.get(i)+"空格").length());
ws.addCell(new Label(i, 0, columns.get(i), wcf1));
}
//判断表中是否有数据
if (objData != null && objData.size() > 0) {
//循环写入表中数据
for (int i = 0; i < objData.size(); i++) {
//转换成map集合{activyName:测试功能,count:2}
Map<String, Object> map = (Map<String, Object>)objData.get(i);
//循环输出map中的子集:既列值
int j=0;
for(Object o:map.keySet()){
//ps:因为要“”通用”“导出功能,所以这里循环的时候不是get("Name"),而是通过map.get(o)
//根据内容自动设置列宽
int columnSize = new String("空格"+map.get(o)+"空格").length()<8?8:new String("空格"+map.get(o)+"空格").length();
ws.setColumnView(j, columnSize);
ws.addCell(new Label(j,i+1,(String.valueOf(map.get(o))==null||"null".equals(String.valueOf(map.get(o))))?"--":String.valueOf(map.get(o)),wcf2));
j++;
}
}
}else{
flag = -1;
}
//写入Exel工作表
wwb.write();
//关闭Excel工作薄对象
wwb.close();
//关闭流
os.flush();
os.close();
os =null;
}
}catch (IllegalStateException e) {
System.err.println(e.getMessage());
}
catch (Exception ex) {
flag = 0;
ex.printStackTrace();
}
return flag;
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!