一、思路:从数据库表中查出list ,封装到 HSSFWorkook 中,再由HSSFWorkook 写出到 File 中,
用 response 的 build 方法 实现下载、导出。
二、 实现代码:
要加上注解 :@Produces ,文本就写 text , 图片写 img ( 如果我没有记错的话)
代码语言:javascript复制 @Path("/exportWWCollectReport")
@Produces("text/plain")
@GET
@Override
public Response exportWorkWeights(
@QueryParam("tableName") @DefaultValue("工作权重统计报表") String tableName,
@QueryParam("startTime") String startTime,
@QueryParam("endTime") String endTime,
@QueryParam("employeeNo") String employeeNo,
@QueryParam("organizeId") String organizeId,
@QueryParam("employeeName") String employeeName,
@QueryParam("position") String position,
@QueryParam("jobTypeId") String jobTypeId,
@QueryParam("projectId") String projectId) {
try{
return workWeightCollectService.exportWorkWeights(tableName, startTime, endTime, employeeNo,
organizeId, employeeName, position, jobTypeId, projectId);
}catch (Exception ex){
logger.debug("工作权重统计报表导出失败:",ex.getMessage());
return null;
}
}
要导这个包下的 response :
代码语言:javascript复制import javax.ws.rs.core.Response;
代码语言:javascript复制 @Override
public Response exportWorkWeights(String tableName, String startTime, String endTime, String employeeNo,
String organizeId, String employeeName, String position, String jobTypeId, String projectId) throws Exception {
// 要导出的列表数据
String sql = getWorkWeightCollectReportSql( startTime, endTime, employeeNo,
organizeId, employeeName, position, jobTypeId, projectId);
List<Object> wwList = getResultList(sql);
if (null == wwList){
return null;
}
List<List<Object>> list = new ArrayList<List<Object>>(); // list 是要导出的表数据
WorkWeightDto ww = null;
String startT = null;
String endT = null;
WorkWeightDto wwdto = new WorkWeightDto();
for (Object ob : wwList) {
Object[] obj = (Object[])ob;
List<Object> dataList = new ArrayList<Object>();
startT = String.valueOf(obj[0]) == null ? "":String.valueOf(obj[0]);
endT = String.valueOf(obj[1]) == null ? "": String.valueOf(obj[1]);
dataList.add(startT " 至 " endT);
dataList.add(String.valueOf(obj[2]) == null ? "":String.valueOf(obj[2])); // 工号
dataList.add(String.valueOf(obj[10]) == null ? "":String.valueOf(obj[10])); // 中心
String bu = String.valueOf(obj[11]);
wwdto = setOrganizeBu(wwdto, bu);
String ke = String.valueOf(obj[12]);
wwdto = setOrganizeKe(wwdto,ke);
String shi = String.valueOf(obj[13]);
if(shi.substring(shi.length()-2,shi.length()).contains("室")){
wwdto.setShi(shi);
}else {
wwdto = setOrganizeKe(wwdto, shi);
}
dataList.add(wwdto.getBu()); // 部
dataList.add(wwdto.getKe()); // 科
dataList.add(wwdto.getShi()); // 室
dataList.add(String.valueOf(obj[3]) == null ? "":String.valueOf(obj[3])); //姓名
dataList.add(String.valueOf(obj[8]) == null ? "":String.valueOf(obj[8])); // 职级
dataList.add(String.valueOf(obj[5]) == null ? "":String.valueOf(obj[5])); // 工作类型
dataList.add(String.valueOf(obj[7]) == null ? "":String.valueOf(obj[7])); // 项目
dataList.add(String.valueOf(obj[9]) == null ? "":String.valueOf(obj[14])); // 工作任务
dataList.add(String.valueOf(obj[9]) == null ? "":String.valueOf(obj[9])); // 比例
list.add(dataList);
}
//表头
String[] headers = new String[]{"所属周期","工号","中心","部门","科","室","姓名","职级","工作类型","项目","工作任务","比例"};
FileOutputStream fileOut = null;
try{
HSSFWorkbook workbook = ExportUtil.excelOut(headers, list);
fileOut = new FileOutputStream(tableName ".xlsx");
workbook.write(fileOut);
// 以上是写入文件,以下是下载文件
File file = new File(tableName ".xlsx");
Response.ResponseBuilder response = Response.ok(file);
response.header("Content-Disposition","attachment; filename=" new String((tableName ".xlsx").getBytes("gbk"), "iso8859-1"));
return response.build();
} catch (Exception e){
e.printStackTrace();
return null;
}
finally {
fileOut.close();
}
}
代码语言:javascript复制import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import java.io.FileOutputStream;
import java.util.List;
public class ExportUtil {
public static HSSFWorkbook excelOut(String[] cloumName, List<List<Object>> list){
//声明一个工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//生成一个表格
HSSFSheet sheet = workbook.createSheet();
//设置表格默认列宽度为20个字符
sheet.setDefaultColumnWidth(20);
//生成一个样式,用来设置标题样式
HSSFCellStyle style = workbook.createCellStyle();
// 表头居中
style.setAlignment(HorizontalAlignment.CENTER);
//生成一个字体
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 12); // 字体高度
font.setFontName(" 黑体 "); // 字体
//把字体应用到当前的样式
style.setFont(font);
// 生成并设置另一个样式,用于设置内容样式
HSSFCellStyle style2 = workbook.createCellStyle();
style2.setAlignment(HorizontalAlignment.CENTER);
// 生成另一个字体
HSSFFont font2 = workbook.createFont();
font2.setFontName(" 黑体 "); // 字体
// 把字体应用到当前的样式
style2.setFont(font2);
HSSFRow row = sheet.createRow(0);
for(int i = 0; i < cloumName.length; i ){
//单元格
HSSFCell cellHead = row.createCell(i);
cellHead.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(cloumName[i]);
cellHead.setCellValue(text);
}
for (int i = 0; i < list.size(); i ){
row = sheet.createRow(i 1);
List<Object> dataList = list.get(i);
for (int j = 0; j < dataList.size(); j ) {
// 表格内容样式设置
HSSFCell cellHead = row.createCell(j);
cellHead.setCellStyle(style2);
HSSFRichTextString text = new HSSFRichTextString(String.valueOf(dataList.get(j)));
// 为空
if(text == null || text.toString() == ""){
cellHead.setCellValue("");
}
/* // 整数,不为电话
else if(ValidateUtils.isInteger(String.valueOf(text))
&& !(StringUtils.startsWith(String.valueOf(text),"1")
&& String.valueOf(text).length() == 11)){
cellHead.setCellValue(Integer.parseInt(String.valueOf(text)));
}
// 有小数、或为电话
else if(ValidateUtils.isDouble(dataList.get(j).toString())){
cellHead.setCellValue(Double.parseDouble(String.valueOf(text)));
}*/
// 字符串
else{
cellHead.setCellValue(String.valueOf(text));
}
}
}
return workbook;
}
}
另: xlsx 格式的表格,容量数据条数有上限,大约是36000 条数据。建议使用 csv 格式的表格, 可以保存极大的数据量。
生成的临时文件存放在工程中,记得删除。