PoiExcelUtils.java


  1. /**
  2. *
  3. */
  4. package com.common.office;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.FileOutputStream;
  8. import java.text.NumberFormat;
  9. import java.util.ArrayList;
  10. import java.util.Calendar;
  11. import java.util.List;
  12. import net.sf.json.JSONArray;
  13. import org.apache.commons.collections.CollectionUtils;
  14. import org.apache.commons.io.IOUtils;
  15. import org.apache.commons.lang.ArrayUtils;
  16. import org.apache.commons.lang.StringUtils;
  17. import org.apache.log4j.Logger;
  18. import org.apache.poi.hssf.usermodel.HSSFCell;
  19. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  20. import org.apache.poi.hssf.usermodel.HSSFFont;
  21. import org.apache.poi.hssf.usermodel.HSSFRichTextString;
  22. import org.apache.poi.hssf.usermodel.HSSFRow;
  23. import org.apache.poi.hssf.usermodel.HSSFSheet;
  24. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  25. import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  26. import org.apache.poi.ss.usermodel.CellStyle;
  27. import org.apache.poi.ss.usermodel.Font;
  28. import org.apache.poi.ss.util.CellRangeAddress;
  29. import com.common.reflect.ReflectUtils;
  30. /**
  31. * Excel工具类
  32. * @author luolin
  33. */
  34. public class PoiExcelUtils {
  35. private static NumberFormat format = NumberFormat.getInstance();
  36. /** 日志 */
  37. private static final Logger LOGGER = Logger.getLogger(PoiExcelUtils.class);
  38. /** 列默认宽度 */
  39. private static final int DEFAUL_COLUMN_WIDTH = 4000;
  40. /**
  41. * 1.创建 workbook
  42. *
  43. * @return {@link HSSFWorkbook}
  44. */
  45. private HSSFWorkbook getHSSFWorkbook() {
  46. LOGGER.info("【创建 workbook】");
  47. return new HSSFWorkbook();
  48. }
  49. /**
  50. * 2.创建 sheet
  51. *
  52. * @param hssfWorkbook {@link HSSFWorkbook}
  53. * @param sheetName sheet 名称
  54. * @return {@link HSSFSheet}
  55. */
  56. private HSSFSheet getHSSFSheet(HSSFWorkbook hssfWorkbook, String sheetName) {
  57. LOGGER.info("【创建 sheet】sheetName : " + sheetName);
  58. return hssfWorkbook.createSheet(sheetName);
  59. }
  60. /**
  61. * 3.写入表头信息
  62. *
  63. * @param hssfWorkbook {@link HSSFWorkbook}
  64. * @param hssfSheet {@link HSSFSheet}
  65. * @param headers 列标题,数组形式,
  66. * 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
  67. * 其中参数@columnWidth可选,columnWidth为整型数值
  68. * @param title 标题
  69. */
  70. private void writeHeader(HSSFWorkbook hssfWorkbook, HSSFSheet hssfSheet, String[] headers, String title) {
  71. LOGGER.info("【写入表头信息】");
  72. // 头信息处理
  73. String[] newHeaders = headersHandler(headers);
  74. // 初始化标题和表头单元格样式
  75. HSSFCellStyle titleCellStyle = createTitleCellStyle(hssfWorkbook);
  76. // 标题栏
  77. HSSFRow titleRow = hssfSheet.createRow(0);
  78. titleRow.setHeight((short) 500);
  79. HSSFCell titleCell = titleRow.createCell(0);
  80. // 设置标题文本
  81. titleCell.setCellValue(new HSSFRichTextString(title));
  82. // 设置单元格样式
  83. titleCell.setCellStyle(titleCellStyle);
  84. // 处理单元格合并,四个参数分别是:起始行,终止行,起始行,终止列
  85. hssfSheet.addMergedRegion(new CellRangeAddress(0, 0, (short) 0, (short) (newHeaders.length - 1)));
  86. // 设置合并后的单元格的样式
  87. titleRow.createCell(newHeaders.length - 1).setCellStyle(titleCellStyle);
  88. // 表头
  89. HSSFRow headRow = hssfSheet.createRow(1);
  90. headRow.setHeight((short) 500);
  91. HSSFCell headCell = null;
  92. String[] headInfo = null;
  93. // 处理excel表头
  94. for (int i = 0, len = newHeaders.length; i < len; i++) {
  95. headInfo = newHeaders[i].split("@");
  96. headCell = headRow.createCell(i);
  97. headCell.setCellValue(headInfo[0]);
  98. headCell.setCellStyle(titleCellStyle);
  99. // 设置列宽度
  100. setColumnWidth(i, headInfo, hssfSheet);
  101. }
  102. }
  103. /**
  104. * 头信息校验和处理
  105. * @param headers
  106. */
  107. private String[] headersHandler(String[] headers) {
  108. List<String> newHeaders = new ArrayList<String>();
  109. for (String string : headers) {
  110. if (StringUtils.isNotBlank(string)) {
  111. newHeaders.add(string);
  112. }
  113. }
  114. int size = newHeaders.size();
  115. return newHeaders.toArray(new String[size]);
  116. }
  117. /**
  118. * 4.写入内容部分
  119. *
  120. * @param hssfWorkbook {@link HSSFWorkbook}
  121. * @param hssfSheet {@link HSSFSheet}
  122. * @param headers 列标题,数组形式,
  123. * 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
  124. * 其中参数@columnWidth可选,columnWidth为整型数值
  125. * @param dataList 要导出的数据集合
  126. * @throws Exception
  127. */
  128. private void writeContent(HSSFWorkbook hssfWorkbook, HSSFSheet hssfSheet, String[] headers, List<?> dataList)
  129. throws Exception {
  130. LOGGER.info("【写入Excel内容部分】");
  131. // 2015-8-13 增加,当没有数据的时候,把原来抛异常的方式修改成返回一个只有头信息,没有数据的空Excel
  132. if (CollectionUtils.isEmpty(dataList)) {
  133. LOGGER.warn("【没有内容数据】");
  134. return;
  135. }
  136. HSSFRow row = null;
  137. HSSFCell cell = null;
  138. // 单元格的值
  139. Object cellValue = null;
  140. // 数据写入行索引
  141. int rownum = 2;
  142. // 单元格样式
  143. HSSFCellStyle cellStyle = createContentCellStyle(hssfWorkbook);
  144. // 遍历集合,处理数据
  145. for (int j = 0, size = dataList.size(); j < size; j++) {
  146. row = hssfSheet.createRow(rownum);
  147. for (int i = 0, len = headers.length; i < len; i++) {
  148. cell = row.createCell(i);
  149. cellValue = ReflectUtils.getCellValue(dataList.get(j), headers[i].split("@")[1]);
  150. cellValueHandler(cell, cellValue);
  151. cell.setCellStyle(cellStyle);
  152. }
  153. rownum++;
  154. }
  155. }
  156. /**
  157. * 设置列宽度
  158. * @param i 列的索引号
  159. * @param headInfo 表头信息,其中包含了用户需要设置的列宽
  160. */
  161. private void setColumnWidth(int i, String[] headInfo, HSSFSheet hssfSheet) {
  162. if (headInfo.length < 3) {
  163. // 用户没有设置列宽,使用默认宽度
  164. hssfSheet.setColumnWidth(i, DEFAUL_COLUMN_WIDTH);
  165. return;
  166. }
  167. if (StringUtils.isBlank(headInfo[2])) {
  168. // 使用默认宽度
  169. hssfSheet.setColumnWidth(i, DEFAUL_COLUMN_WIDTH);
  170. return;
  171. }
  172. // 使用用户设置的列宽进行设置
  173. hssfSheet.setColumnWidth(i, Integer.parseInt(headInfo[2]));
  174. }
  175. /**
  176. * 单元格写值处理器
  177. * @param {{@link HSSFCell}
  178. * @param cellValue 单元格值
  179. */
  180. private void cellValueHandler(HSSFCell cell, Object cellValue) {
  181. // 2015-8-13 修改,判断cellValue是否为空,否则在cellValue.toString()会出现空指针异常
  182. if (cellValue == null) {
  183. cell.setCellValue("");
  184. return;
  185. }
  186. if (cellValue instanceof String) {
  187. cell.setCellValue((String) cellValue);
  188. } else if (cellValue instanceof Boolean) {
  189. cell.setCellValue((Boolean) cellValue);
  190. } else if (cellValue instanceof Calendar) {
  191. cell.setCellValue((Calendar) cellValue);
  192. } else if (cellValue instanceof Double) {
  193. cell.setCellValue((Double) cellValue);
  194. } else if (cellValue instanceof Integer || cellValue instanceof Long || cellValue instanceof Short
  195. || cellValue instanceof Float) {
  196. cell.setCellValue((Double.parseDouble(cellValue.toString())));
  197. } else if (cellValue instanceof HSSFRichTextString) {
  198. cell.setCellValue((HSSFRichTextString) cellValue);
  199. }
  200. cell.setCellValue(cellValue.toString());
  201. }
  202. /**
  203. * 创建标题和表头单元格样式
  204. * @param hssfWorkbook {@link HSSFWorkbook}
  205. * @return {@link HSSFCellStyle}
  206. */
  207. private HSSFCellStyle createTitleCellStyle(HSSFWorkbook hssfWorkbook) {
  208. LOGGER.info("【创建标题和表头单元格样式】");
  209. // 单元格的样式
  210. HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();
  211. // 设置字体样式,改为不变粗
  212. HSSFFont font = hssfWorkbook.createFont();
  213. font.setFontHeightInPoints((short) 13);
  214. font.setBoldweight(Font.BOLDWEIGHT_BOLD);
  215. cellStyle.setFont(font);
  216. // 单元格垂直居中
  217. cellStyle.setVerticalAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
  218. // 设置通用的单元格属性
  219. setCommonCellStyle(cellStyle);
  220. return cellStyle;
  221. }
  222. /**
  223. * 创建内容单元格样式
  224. * @param hssfWorkbook {@link HSSFWorkbook}
  225. * @return {@link HSSFCellStyle}
  226. */
  227. private HSSFCellStyle createContentCellStyle(HSSFWorkbook hssfWorkbook) {
  228. LOGGER.info("【创建内容单元格样式】");
  229. // 单元格的样式
  230. HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();
  231. // 设置字体样式,改为不变粗
  232. HSSFFont font = hssfWorkbook.createFont();
  233. font.setFontHeightInPoints((short) 11);
  234. cellStyle.setFont(font);
  235. // 设置单元格自动换行
  236. cellStyle.setWrapText(true);
  237. // 单元格垂直居中
  238. cellStyle.setVerticalAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
  239. //水平居中
  240. // cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  241. // 设置通用的单元格属性
  242. setCommonCellStyle(cellStyle);
  243. return cellStyle;
  244. }
  245. /**
  246. * 设置通用的单元格属性
  247. * @param cellStyle 要设置属性的单元格
  248. */
  249. private void setCommonCellStyle(HSSFCellStyle cellStyle) {
  250. // 居中
  251. cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
  252. // 设置边框
  253. cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  254. cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  255. cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
  256. cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
  257. }
  258. /**
  259. * 将生成的Excel输出到指定目录
  260. * @param hssfWorkbook {@link HSSFWorkbook}
  261. * @param filePath 文件输出目录,包括文件名(.xls)
  262. */
  263. private void write2FilePath(HSSFWorkbook hssfWorkbook, String filePath) {
  264. LOGGER.info("【将生成的Excel输出到指定目录】filePath :" + filePath);
  265. FileOutputStream fileOut = null;
  266. try {
  267. fileOut = new FileOutputStream(filePath);
  268. hssfWorkbook.write(fileOut);
  269. } catch (Exception e) {
  270. LOGGER.error("【将生成的Excel输出到指定目录失败】", e);
  271. throw new RuntimeException("将生成的Excel输出到指定目录失败");
  272. } finally {
  273. IOUtils.closeQuietly(fileOut);
  274. }
  275. }
  276. /**
  277. * 生成Excel,存放到指定目录
  278. * @param sheetName sheet名称
  279. * @param title 标题
  280. * @param filePath 要导出的Excel存放的文件路径
  281. * @param headers 列标题,数组形式,
  282. * 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
  283. * 其中参数@columnWidth可选,columnWidth为整型数值
  284. * @param dataList 要导出数据的集合
  285. * @throws Exception
  286. */
  287. public static void createExcel2FilePath(String sheetName, String title, String filePath, String[] headers,
  288. List<?> dataList) throws Exception {
  289. LOGGER.info("【生成Excel,并存放到指定文件夹目录下】sheetName : " + sheetName + " , title : " + title + " , filePath : "
  290. + filePath + " , headers : " + JSONArray.fromObject(headers));
  291. if (ArrayUtils.isEmpty(headers)) {
  292. LOGGER.warn("【表头为空】");
  293. throw new RuntimeException("表头不能为空");
  294. }
  295. PoiExcelUtils poiExcelUtil = new PoiExcelUtils();
  296. // 1.创建 Workbook
  297. HSSFWorkbook hssfWorkbook = poiExcelUtil.getHSSFWorkbook();
  298. // 2.创建 Sheet
  299. HSSFSheet hssfSheet = poiExcelUtil.getHSSFSheet(hssfWorkbook, sheetName);
  300. // 3.写入 head
  301. poiExcelUtil.writeHeader(hssfWorkbook, hssfSheet, headers, title);
  302. // 4.写入内容
  303. poiExcelUtil.writeContent(hssfWorkbook, hssfSheet, headers, dataList);
  304. // 5.保存文件到filePath中
  305. poiExcelUtil.write2FilePath(hssfWorkbook, filePath);
  306. }
  307. /**
  308. * 生成Excel的WorkBook,用于导出Excel
  309. * @param sheetName sheet名称
  310. * @param title 标题
  311. * @param headers 列标题,数组形式,
  312. * 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
  313. * 其中参数@columnWidth可选,columnWidth为整型数值
  314. * @param dataList 要导出数据的集合
  315. * @throws Exception
  316. */
  317. public static HSSFWorkbook createExcel2Export(String sheetName, String title, String[] headers, List<?> dataList)
  318. throws Exception {
  319. LOGGER.info("【生成Excel的WorkBook,用于导出Excel】sheetName : " + sheetName + " , title : " + title + " , headers : "
  320. + JSONArray.fromObject(headers));
  321. if (ArrayUtils.isEmpty(headers)) {
  322. LOGGER.warn("【表头为空】");
  323. throw new RuntimeException("表头不能为空");
  324. }
  325. PoiExcelUtils poiExcelUtil = new PoiExcelUtils();
  326. // 1.创建 Workbook
  327. HSSFWorkbook hssfWorkbook = poiExcelUtil.getHSSFWorkbook();
  328. // 2.创建 Sheet
  329. HSSFSheet hssfSheet = poiExcelUtil.getHSSFSheet(hssfWorkbook, sheetName);
  330. // 3.写入 head
  331. poiExcelUtil.writeHeader(hssfWorkbook, hssfSheet, headers, title);
  332. // 4.写入内容
  333. poiExcelUtil.writeContent(hssfWorkbook, hssfSheet, headers, dataList);
  334. return hssfWorkbook;
  335. }
  336. /**
  337. * 创建知识库TOP3系统渠道统计的Excel数据
  338. * @param sheetName sheet名称
  339. * @param title 标题
  340. * @param headers 列标题,数组形式,
  341. * 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
  342. * 其中参数@columnWidth可选,columnWidth为整型数值
  343. * @param dataList 要导出数据的集合
  344. */
  345. public static HSSFWorkbook createknowledgeTop3Excel(String sheetName, String title, String[] headers,
  346. List<List<?>> dataList) {
  347. LOGGER.info("【生成Excel的WorkBook,用于导出Excel】sheetName : " + sheetName + " , title : " + title + " , headers : "
  348. + JSONArray.fromObject(headers));
  349. if (ArrayUtils.isEmpty(headers)) {
  350. LOGGER.warn("【表头为空】");
  351. throw new RuntimeException("表头不能为空");
  352. }
  353. PoiExcelUtils poiExcelUtil = new PoiExcelUtils();
  354. // 1.创建 Workbook
  355. HSSFWorkbook hssfWorkbook = poiExcelUtil.getHSSFWorkbook();
  356. // 2.创建 Sheet
  357. HSSFSheet hssfSheet = poiExcelUtil.getHSSFSheet(hssfWorkbook, sheetName);
  358. // 3.写入 head
  359. poiExcelUtil.writeHeader(hssfWorkbook, hssfSheet, headers, title);
  360. // 4.写入内容
  361. try {
  362. poiExcelUtil.writeComplexContent(hssfWorkbook, hssfSheet, headers, dataList);
  363. } catch (Exception e) {
  364. LOGGER.error("【写入内容部分失败】", e);
  365. throw new RuntimeException("写入内容部分失败");
  366. }
  367. return hssfWorkbook;
  368. }
  369. /**
  370. * 生成内容部分(复杂内容,每列来自不同的数据集合)
  371. * @param hssfWorkbook {@link HSSFWorkbook}
  372. * @param hssfSheet {@link HSSFSheet}
  373. * @param headers 列标题,数组形式,
  374. * 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
  375. * 其中参数@columnWidth可选,columnWidth为整型数值
  376. * @param dataList 要导出数据的集合
  377. * @throws Exception
  378. */
  379. private void writeComplexContent(HSSFWorkbook hssfWorkbook, HSSFSheet hssfSheet, String[] headers,
  380. List<List<?>> dataList) throws Exception {
  381. LOGGER.info("【写入Excel内容部分】");
  382. // 2015-8-13 增加,当没有数据的时候,把原来抛异常的方式修改成返回一个只有头信息,没有数据的空Excel
  383. if (CollectionUtils.isEmpty(dataList)) {
  384. LOGGER.warn("【没有内容数据】");
  385. return;
  386. }
  387. HSSFRow row = null;
  388. HSSFCell cell = null;
  389. // 单元格的值
  390. Object cellValue = null;
  391. // 数据写入行索引
  392. int rownum = 2;
  393. // 单元格样式
  394. HSSFCellStyle cellStyle = createContentCellStyle(hssfWorkbook);
  395. // 遍历集合,处理数据
  396. // 要写的内容的行数
  397. int rows = dataList.get(0).size();
  398. // 除去固定列“日期”外,还需要写的列数
  399. int columns = dataList.size();
  400. /**
  401. * 思路说明
  402. * 如果是top3,那么dataList的长度应该是3(即除去固定列“日期”剩下的列数)
  403. * 其次索引依次是top1的数据、top2的数据、top3的数据
  404. * top1/top2/top3的数据长度表示行数
  405. * 第一层循环,肯定以行数为基准来进行
  406. * 然后第一层循环的第一步是完成固定列的数据填充
  407. * 第二步是填充对应行每个列的数据,而每个列的数据应该分别从top1、top2、top3中取
  408. */
  409. for (int j = 0; j < rows; j++) {
  410. row = hssfSheet.createRow(rownum);
  411. // 写固定列“日期”
  412. cell = row.createCell(0);
  413. cellValue = ReflectUtils.getCellValue(dataList.get(0).get(j), headers[0].split("@")[1]);
  414. cellValueHandler(cell, cellValue);
  415. cell.setCellStyle(cellStyle);
  416. for (int i = 1; i <= columns; i++) {
  417. cell = row.createCell(i);
  418. cellValue = ReflectUtils.getCellValue(dataList.get(i - 1).get(j), headers[i].split("@")[1]);
  419. cellValueHandler(cell, cellValue);
  420. cell.setCellStyle(cellStyle);
  421. }
  422. rownum++;
  423. }
  424. }
  425. /**
  426. * 根据文件路径读取excel文件
  427. * @param excelPath excel的路径
  428. * @param skipRows 需要跳过的行数
  429. * @return List<String[]> 集合中每一个元素是一个数组,按单元格索引存储每个单元格的值,一个元素可以封装成一个需要的java bean
  430. * @throws Exception
  431. */
  432. public static List<String[]> readExcel(String excelPath, int skipRows, int columCount) throws Exception {
  433. LOGGER.info("【读取Excel】excelPath : " + excelPath + " , skipRows : " + skipRows);
  434. FileInputStream is = new FileInputStream(new File(excelPath));
  435. POIFSFileSystem fs = new POIFSFileSystem(is);
  436. HSSFWorkbook wb = new HSSFWorkbook(fs);
  437. List<String[]> list = new ArrayList<String[]>();
  438. HSSFSheet sheet = wb.getSheetAt(0);
  439. // 得到总共的行数
  440. int rowNum = sheet.getPhysicalNumberOfRows();
  441. try {
  442. for (int i = skipRows; i < rowNum; i++) {
  443. String[] vals = new String[columCount];
  444. HSSFRow row = sheet.getRow(i);
  445. if (null == row) {
  446. continue;
  447. }
  448. for (int j = 0; j < columCount; j++) {
  449. HSSFCell cell = row.getCell(j);
  450. String val = getStringCellValue(cell);
  451. vals[j] = val;
  452. }
  453. list.add(vals);
  454. }
  455. } catch (Exception e) {
  456. LOGGER.error("【Excel解析失败】", e);
  457. throw new RuntimeException("Excel解析失败");
  458. } finally {
  459. wb.close();
  460. }
  461. return list;
  462. }
  463. /**
  464. * 获取单元格数据内容为字符串类型的数据
  465. *
  466. * @param cell Excel单元格
  467. * @return String 单元格数据内容
  468. */
  469. private static String getStringCellValue(HSSFCell cell) {
  470. if (cell == null)
  471. return "";
  472. String strCell = "";
  473. switch (cell.getCellType()) {
  474. case HSSFCell.CELL_TYPE_STRING:
  475. strCell = cell.getStringCellValue();
  476. break;
  477. case HSSFCell.CELL_TYPE_NUMERIC:
  478. strCell = String.valueOf(format.format(cell.getNumericCellValue())).replace(",", "");
  479. break;
  480. case HSSFCell.CELL_TYPE_BOOLEAN:
  481. strCell = String.valueOf(cell.getBooleanCellValue());
  482. break;
  483. case HSSFCell.CELL_TYPE_BLANK:
  484. strCell = "";
  485. break;
  486. default:
  487. strCell = "";
  488. break;
  489. }
  490. if (strCell.equals("") || strCell == null) {
  491. return "";
  492. }
  493. return strCell;
  494. }
  495. /**
  496. * 生成车票销售总量统计表格
  497. * @param sheetName sheet名称
  498. * @param title 标题
  499. * @param headers 列标题,数组形式,
  500. * 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
  501. * 其中参数@columnWidth可选,columnWidth为整型数值
  502. * @param dataList 要导出数据的集合
  503. * @return {@link HSSFWorkbook}
  504. * @Author : luolin. create at 2015年12月22日 下午5:17:04
  505. */
  506. public static HSSFWorkbook createTicketReportExcel(String sheetName, String title, String[] headers,
  507. List<List<?>> dataList) {
  508. LOGGER.info("【生成车票销售总量统计表格】sheetName : " + sheetName + " , title : " + title + " , headers : "
  509. + JSONArray.fromObject(headers));
  510. if (ArrayUtils.isEmpty(headers)) {
  511. LOGGER.warn("【表头为空】");
  512. throw new RuntimeException("表头不能为空");
  513. }
  514. PoiExcelUtils poiExcelUtil = new PoiExcelUtils();
  515. // 1.创建 Workbook
  516. HSSFWorkbook hssfWorkbook = poiExcelUtil.getHSSFWorkbook();
  517. // 2.创建 Sheet
  518. HSSFSheet hssfSheet = poiExcelUtil.getHSSFSheet(hssfWorkbook, sheetName);
  519. // 3.写入 head
  520. poiExcelUtil.writeHeader(hssfWorkbook, hssfSheet, headers, title);
  521. // 4.写入内容
  522. try {
  523. poiExcelUtil.writeComplexContent(hssfWorkbook, hssfSheet, headers, dataList);
  524. } catch (Exception e) {
  525. LOGGER.error("【写入内容部分失败】", e);
  526. throw new RuntimeException("写入内容部分失败");
  527. }
  528. return hssfWorkbook;
  529. }
  530. }

使用POI做的一个生成Excel的工具类。包含了导出Excel和解析Excel方法的更多相关文章

  1. 使用Apache poi来编写导出excel的工具类

    在JavaWeb开发的需求中,我们会经常看到导出excel的功能需求,然后java并没有提供操作office文档的功能,这个时候我们就需要使用额外的组件来帮助我们完成这项功能了. 很高兴Apache基 ...

  2. java里poi操作excel的工具类(兼容各版本)

    转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...

  3. 我做了一个 HTML 可视化编辑工具,有前途吗?

    疫情在家的这段时间,我做了一个 HTML 可视化编辑工具,做的时候信心满满,差不多完成了,现在反而不如以前信心足了,这玩意有用吗?代码地址: https://github.com/vularsoft/ ...

  4. Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

    Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...

  5. 下载数据到Excel,工具类

    使用反射将model数据下载到Excel中 package test.upload.utils; import java.lang.reflect.Method; import java.math.B ...

  6. excel读取 工具类

    package cn.yongche.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOExce ...

  7. Excel导入工具类兼容xls和xlsx

    package com.bj58.finance.platform.operation.provider.util; import org.apache.log4j.Logger; import or ...

  8. JAVA生成订单编号工具类

    JAVA根据时间戳和随机数方式生成订单编号工具类 OrderUtils.java package com.util; import java.text.DateFormat; import java. ...

  9. 使用POI插件,提取导出excel的工具类

    在网站的不同的模块都需要使用到导入导出excel的功能,我们就需要写一个通用的工具类ExcelUtil. 我的思路:首先,导入和导出的Excel的文件格式固定:主标题,二级标题,数据行(姑且就这么叫) ...

随机推荐

  1. _beginthreadex创建线程,立即执行?

    一个线程创建后,并不是立马就执行,而是等时间片到来后才执行...  C++ Code  12345678910111213141516171819202122232425262728293031323 ...

  2. Log4j 汇总

    一.概念 .1. log4j是 是线程安全的 日志框架,高度可配置,可通过在运行时的外部文件配置. 默认情况下,日志管理在CLASSPATH 查找一个名为 log4j.properties 的文件. ...

  3. php 对字符串的分块处理

    //如何把以下的字符串分成每一个小块, 如:2017.2.14\n我们都是中国人\n小日本 这样的为一个小块 $str = '2017.2.14 我们都是中国人 小日本 2017.2.15 订单取消 ...

  4. javascript 字符串进行 utf8 编码的方法(转)

    实践中碰到了一个大问题,在 javascript 中,可能有一些中文字符串,我们想将其进行二进制流编码的时候,需要将其转换为 utf8 的编码. 也就是说,输入的是一个字符串:'呆滞的慢板今天挣了10 ...

  5. 面试题思考:什么是基于注解的切面实现?(AOP是Aspect Oriented Program的首字母缩写)

    首先解释下AOP :在程序运行时,动态的将代码切入到类的指定方法.指定位置上的编程思想就是面向切面编程 一般而言,我们管切入到指定类指定方法的代码片段为切面,而切入的哪些类.哪些方法则叫切入点.有了A ...

  6. CGContextRef用法

    本文转载至 http://blog.csdn.net/perfect_promise/article/details/7660220 quartz 是主要的描画接口,支持基于路径的描画. 抗锯齿渲染. ...

  7. iOS-UIScrollView拉伸效果

    解决办法: 比如登录界面是可以上下拉伸的(微信),在ScrollView里调用一下这个方法即可. scrollView.alwaysBounceVertical = YES;

  8. html ; css ; javascript ; json ;

    [说明]今天因为看到了前端的js页面和html页面,觉得有必要熟悉一下他们的基本语法,所以花了一天的时间去复习巩固了一下(之前学习过),包括html语法,css语法,javascript语法,对象.B ...

  9. 爬虫实战【9】Selenium解析淘宝宝贝-获取宝贝信息并保存

    通过昨天的分析,我们已经能到依次打开多个页面了,接下来就是获取每个页面上宝贝的信息了. 分析页面宝贝信息 [插入图片,宝贝信息各项内容] 从图片上看,每个宝贝有如下信息:price,title,url ...

  10. shop++源码反编译----随笔

    一.applicationContext-mvc.xml配置 1.读取配置文件 <context:property-placeholder location="classpath*:/ ...