一、基本知识
1.Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
2. HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。
3.POI 文档结构类
HSSFWorkbook excel文档对象
HSSFSheet excel的sheet HSSFRow excel的行
HSSFCell excel的单元格 HSSFFont excel字体
HSSFName 名称 HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾
HSSFCellStyle cell样式
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
二、使用逻辑:
1.前端页面发起请求
2.控制器接收,并调用sql 语句查询需要导出的条件
3.调用导出excel模块工具类
1.页面请求
<script type="text/javascript"> $(function(){ //导出数据执行方法 $("#btn_print").click(function() { location.href = "../baseExcelExport/export" }); }) </script>
2.调用控制器
public void getExportFile(RedirectAttributes redirectAttributes,HttpServletResponse resp){ List<BaseAssetsEquipment> list = baseAssestsEquipmentService.getExcelList(); Map<String,String> titleMap = new LinkedHashMap<String,String>(); titleMap.put("paymentNo", "设备编号"); titleMap.put("customerNo", "设备名称"); String sheetName = "标题名"; ExportExcelUtils.excelExport(list, titleMap, sheetName, response); }
3.导出工具类
public class ExportExcelUtils { /*** * 构造方法 */ private ExportExcelUtils() { } /*** * 工作簿 */ private static HSSFWorkbook workbook; /*** * sheet */ private static HSSFSheet sheet; /*** * 标题行开始位置 */ private static final int TITLE_START_POSITION = 0; /*** * 时间行开始位置 */ private static final int DATEHEAD_START_POSITION = 1; /*** * 表头行开始位置 */ private static final int HEAD_START_POSITION = 2; /*** * 文本行开始位置 */ private static final int CONTENT_START_POSITION = 3; /** * * @param dataList * 对象集合 * @param titleMap * 表头信息(对象属性名称->要显示的标题值)[按顺序添加] * @param sheetName * sheet名称和表头值 */ public static void excelExport(List<?> dataList,Map<String, String> titleMap, String sheetName,HttpServletResponse resp) { try { String fileName = sheetName+".xls"; fileName = URLEncoder.encode(fileName, "UTF-8"); resp.addHeader("Content-Disposition", "attachment;filename=" + fileName); // 初始化workbook initHSSFWorkbook(sheetName); // 标题行 createTitleRow(titleMap, sheetName); // 时间行 createDateHeadRow(titleMap); // 表头行 createHeadRow(titleMap); // 文本行 createContentRow(dataList, titleMap); // 设置自动伸缩 // autoSizeColumn(titleMap.size()); OutputStream out = resp.getOutputStream(); workbook.write(out); out.close(); } catch (IOException e) { e.printStackTrace(); } } /*** * * @param sheetName * sheetName */ private static void initHSSFWorkbook(String sheetName) { workbook = new HSSFWorkbook(); sheet = workbook.createSheet(sheetName); } /** * 生成标题(第零行创建) * * @param titleMap * 对象属性名称->表头显示名称 * @param sheetName * sheet名称 */ private static void createTitleRow(Map<String, String> titleMap, String sheetName) { CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, titleMap.size() - 1); sheet.addMergedRegion(titleRange); HSSFRow titleRow = sheet.createRow(TITLE_START_POSITION); HSSFCell titleCell = titleRow.createCell(0); titleCell.setCellValue(sheetName); } /** * 创建时间行(第一行创建) * * @param titleMap * 对象属性名称->表头显示名称 */ private static void createDateHeadRow(Map<String, String> titleMap) { CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0, titleMap.size() - 1); sheet.addMergedRegion(dateRange); HSSFRow dateRow = sheet.createRow(DATEHEAD_START_POSITION); HSSFCell dateCell = dateRow.createCell(0); dateCell.setCellValue(new SimpleDateFormat("yyyy年MM月dd日") .format(new Date())); } /** * 创建表头行(第二行创建) * * @param titleMap * 对象属性名称->表头显示名称 */ private static void createHeadRow(Map<String, String> titleMap) { // 第1行创建 HSSFRow headRow = sheet.createRow(HEAD_START_POSITION); int i = 0; for (String entry : titleMap.keySet()) { HSSFCell headCell = headRow.createCell(i); headCell.setCellValue(titleMap.get(entry)); i++; } } /** * * @param dataList * 对象数据集合 * @param titleMap * 表头信息 */ private static void createContentRow(List<?> dataList,Map<String, String> titleMap) { try { int i = 0; for (Object obj : dataList) { HSSFRow textRow = sheet.createRow(CONTENT_START_POSITION + i); int j = 0; for (String entry : titleMap.keySet()) { String method = "get" + entry.substring(0, 1).toUpperCase()+ entry.substring(1); Method m = obj.getClass().getMethod(method, null); String value = ""; if (m.invoke(obj, null)!=null) { value = m.invoke(obj, null).toString(); if( m.getReturnType().toString().contains("Date")){ value = DateUtils.getStringByDatefindStr(value,"EEE MMM dd HH:mm:ss Z yyyy","yyyy-MM-dd hh:mm:ss"); } } HSSFCell textcell = textRow.createCell(j); textcell.setCellValue(value); j++; } i++; } } catch (Exception e) { e.printStackTrace(); } } /** * 自动伸缩列(如非必要,请勿打开此方法,耗内存) * * @param size * 列数 */ private static void autoSizeColumn(Integer size) { for (int j = 0; j < size; j++) { sheet.autoSizeColumn(j); } } }
完美。
欢迎关注:一只阿木木