POI的使用代码片段
程序员文章站
2022-03-06 22:21:42
...
@RequestMapping("/grossExcel")
@ResponseBody
public void grossExcel(Integer type, String id, String startime, String endtime, Integer value) throws Exception {
// 进行数据的获取
// 类型说明 1:本天 2:本周 3:本月 4:本年 5:自定义年 6:自定义月 7: 自定义天 ------------- 数据的获取
ArrayList<Object> objects = null;
if (type == 1 && "".equals(startime) && "".equals(endtime)) {
objects = jtlService.tianonClickon(id);
} else if (type == 2 && "".equals(startime) && "".equals(endtime)) {
objects = jtlService.tianonClicktow(id);
} else if (type == 3 && "".equals(startime) && "".equals(endtime)) {
objects = jtlService.tianonClickyue(id);
} else if (type == 4 && "".equals(startime) && "".equals(endtime)) {
objects = jtlService.tianonClicknian(id);
} else if (type == 5 && !"".equals(startime) && !"".equals(endtime)) {
objects = jtlService.collectNianClick(id, startime, endtime);
} else if (type == 6 && !"".equals(startime) && !"".equals(endtime)) {
objects = jtlService.collectYueClick(id, startime, endtime);
} else if (type == 7 && !"".equals(startime) && !"".equals(endtime)) {
objects = jtlService.collectTianClick(id, startime, endtime);
}
List<Map<String, Object>> maps = new ArrayList<>();
Map<String, Object> hashMap = new HashMap<>();
if (value == 1) {
// 类型 设置的是在下面获取数据的时候,名称和值 具体的数据
hashMap.put("time", getString(objects.get(0).toString()));
hashMap.put("sxh", "上行");
hashMap.put("flowTotal", getString(objects.get(1).toString()));
hashMap.put("tonsTotal", getString(objects.get(2).toString()));
maps.add(hashMap);
Map<String, Object> hashMap2 = new HashMap<>();
hashMap2.put("time", getString(objects.get(0).toString()));
hashMap2.put("sxh", "下行");
hashMap2.put("flowTotal", getString(objects.get(3).toString()));
hashMap2.put("tonsTotal", getString(objects.get(4).toString()));
maps.add(hashMap2);
} else if (value == 2) {
// 总量
hashMap.put("time", getString(objects.get(0).toString()));
hashMap.put("sxh", "合计");
hashMap.put("flowTotal", getString(objects.get(6).toString()));
hashMap.put("tonsTotal", getString(objects.get(5).toString()));
maps.add(hashMap);
}
// 标题下面的文字
List<String> headers = new ArrayList<>();
headers.add("查询时间");
headers.add("上下行");
headers.add("流量总计(艘)");
headers.add("总准载吨位(吨)");
exportExcel(maps, headers, value);
}
private String getString(String objects) {
int length = objects.length();
return objects.substring(1, length - 1);
}
/**
* 导出Excel
* <p>
* <p>
* <p>
* (船舶登记数据List)
* <p>
* (表头)
*
* @return
* @throws Exception
* @author huangan
*/
@SuppressWarnings({"rawtypes", "deprecation"})
public void exportExcel(List<Map<String, Object>> data, List<String> headers, Integer value) throws Exception {
//------------------首先创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格标题
HSSFSheet sheet = null;
if (value == 1) {
sheet = workbook.createSheet("类型数据");
} else if (value == 2) {
sheet = workbook.createSheet("总量数据");
} else {
sheet = workbook.createSheet("汇总数据");
}
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成并设置另一个样式 表示的是内容的大小
HSSFCellStyle style2 = workbook.createCellStyle();
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 设置标题下一列的文字的 第一个单元格的宽度
sheet.setColumnWidth(0, 12 * 256);
// 设置标题下一列的文字的 其他单元格宽度
for (int index = 0; index < headers.size(); index++) {
if (index != 2) {
sheet.setColumnWidth(index, 20 * 256);
}
}
sheet.setColumnWidth(2, 20 * 260);
// 设置大的标题的数据
HSSFCellStyle style3 = workbook.createCellStyle();
style3.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
HSSFRow row1 = sheet.createRow(0);
row1.setHeight((short) 600);
// 标题字体的大小
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 16);
style3.setFont(font);
// 单元格合并 用于合并单元格的 开始行 结束行 开始列 结束列
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));
//设置标题数据
HSSFRichTextString string = null;
// row1 表示第一行 然后创建第0列
HSSFCell cell1 = row1.createCell(0);
if (value == 1) {
string = new HSSFRichTextString("类型数据");
} else if (value == 2) {
string = new HSSFRichTextString("总量数据");
} else {
string = new HSSFRichTextString("汇总数据");
}
// 创建的内容
cell1.setCellValue(string);
// 创建的时候的样式
cell1.setCellStyle(style3);
// 创建第二行
HSSFRow row = sheet.createRow(1);
// 第二行里面的数据
for (short j = 0; j < headers.size(); j++) {
HSSFCell cell = row.createCell(j);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(headers.get(j));
cell.setCellValue(text);
}
if (data.size() > 0) {
// 取出的船舶首录数据的条数
int cbslNumbet = data.size();
// 将样式,数据,传递进行,进行表格的生成
loopCbdjData(data.size(), data, sheet, row, headers, style2);
}
HttpServletResponse response = response();
response.setContentType("application nd.ms-excel;charset=gb2312");
response.setCharacterEncoding("UTF-8");
// 下载的文件名称
String queryName = "";
if (value == 1) {
queryName = "流量汇总分析-类型数据";
} else if (value == 2) {
queryName = "流量汇总分析-总量数据";
} else {
queryName = "流量汇总分析";
}
queryName = URLEncoder.encode(queryName, "UTF-8");
queryName += ".xls";
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(queryName.getBytes("UTF-8"), "GBK"));
OutputStream out = response.getOutputStream();
workbook.write(out);
out.close();
}
@SuppressWarnings("rawtypes")
public void loopCbdjData(int number, List<Map<String, Object>> data, HSSFSheet sheet,
HSSFRow row, List<String> headers, HSSFCellStyle style2)
throws Exception {
for (int i = 0; i < number; i++) {
Map mapCbdj = (Map) data.get(i);
// 从第三行开始(第一行是空的,第二行是标题)
row = sheet.createRow(i + 2);
// 登记号
Object[] obj = new Object[headers.size()];
// 查询时间
obj[0] = mapCbdj.get("time");
createCell(row, 0, obj[0].toString(), style2);
// 上下行
obj[1] = mapCbdj.get("sxh");
createCell(row, 1, obj[1].toString(), style2);
// 流量总计
obj[2] = mapCbdj.get("flowTotal");
createCell(row, 2, obj[2].toString(), style2);
// 设置总准载吨位
obj[3] = mapCbdj.get("tonsTotal");
createCell(row, 3, obj[3].toString(), style2);
}
}
//update by panqh 2017-05-10 end
/**
* 给单元格赋值
*
* @param row
* @param index
* @param value
* @param normalStyle
*/
private static void createCell(HSSFRow row, int index, String value,
HSSFCellStyle normalStyle) {
// 创建单元格
HSSFCell cell = row.createCell(index);
// 给第一个单元格赋值
if (value != null) {
cell.setCellValue(value);
} else {
cell.setCellValue("");
}
// 设置Style
cell.setCellStyle(normalStyle);
}
// add by shanggq 2018/10/8 end
本案例不能实现单元格内容的自适应宽 -- 有解决方法的请留言
推荐阅读
-
JavaScript使用三种方法定义函数的实现代码分析
-
比较全的PHP 会话(session 时间设定)使用入门代码
-
分享8个最佳的代码片段在线测试网站_PHP
-
【前端开发环境】前端使用GIT管理代码仓库需要掌握的几个必备技巧和知识点总结
-
PHP下使用CURL方式POST数据至API接口的代码_PHP
-
使用JQuery和CSS模拟超链接的用户单击事件的实现代码_jquery
-
php中使用parse_url对网址进行解析的实现代码parse_url详解
-
Python中使用urllib2防止302跳转的代码例子
-
分享8个最佳的代码片段在线测试网站
-
使用原生javascript实现分页效果的代码实例