设为首页 收藏本站
查看: 877|回复: 0

[经验分享] 使用Apache POI导出Excel小结

[复制链接]

尚未签到

发表于 2017-12-24 21:50:36 | 显示全部楼层 |阅读模式
import org.apache.poi.hssf.usermodel.*;  import org.apache.poi.hssf.util.HSSFColor;
  import org.apache.poi.ss.usermodel.*;
  import org.apache.poi.ss.util.CellRangeAddress;
  import javax.imageio.ImageIO;
  import java.io.*;
  import java.text.SimpleDateFormat;
  import java.util.Date;
  import java.util.LinkedHashMap;
  import java.util.List;
  import java.util.Map;
  /**
  * Excel 相关操作类(小数据量写入<=65536)
  */

  public>  private static final int DEFAULT_COLUMN_SIZE = 30;
  /**
  * 断言Excel文件写入之前的条件
  *
  * @param directory 目录
  * @param fileName  文件名
  * @return file
  * @throws IOException
  */
  private static File assertFile(String directory, String fileName) throws IOException {
  File tmpFile = new File(directory + File.separator + fileName + ".xls");
  if (tmpFile.exists()) {
  if (tmpFile.isDirectory()) {
  throw new IOException("File '" + tmpFile + "' exists but is a directory");
  }
  if (!tmpFile.canWrite()) {
  throw new IOException("File '" + tmpFile + "' cannot be written to");
  }
  } else {
  File parent = tmpFile.getParentFile();
  if (parent != null) {
  if (!parent.mkdirs() && !parent.isDirectory()) {
  throw new IOException("Directory '" + parent + "' could not be created");
  }
  }
  }
  return tmpFile;
  }
  /**
  * 日期转化为字符串,格式为yyyy-MM-dd HH:mm:ss
  */
  private static String getCnDate(Date date) {
  String format = "yyyy-MM-dd HH:mm:ss";
  SimpleDateFormat sdf = new SimpleDateFormat(format);
  return sdf.format(date);
  }
  /**
  * Excel 导出,POI实现
  *
  * @param fileName    文件名
  * @param sheetName   sheet页名称
  * @param columnNames 表头列表名
  * @param sheetTitle  sheet页Title
  * @param objects     目标数据集
  */
  public static File writeExcel(String directory, String fileName, String sheetName, List<String> columnNames,
  String sheetTitle, List<List<Object>> objects, boolean append) throws ReportInternalException, IOException {
  File tmpFile = assertFile(directory, fileName);
  return exportExcel(tmpFile, sheetName, columnNames, sheetTitle, objects, append);
  }
  /**
  * Excel 导出,POI实现,先写入Excel标题,与writeExcelData配合使用
  * 先使用writeExcelTitle再使用writeExcelData
  *
  * @param directory   目录
  * @param fileName    文件名
  * @param sheetName   sheetName
  * @param columnNames 列名集合
  * @param sheetTitle  表格标题
  * @param append      是否在现有的文件追加
  * @return file
  * @throws ReportInternalException
  * @throws IOException
  */
  public static File writeExcelTitle(String directory, String fileName, String sheetName, List<String> columnNames,
  String sheetTitle, boolean append) throws ReportInternalException, IOException {
  File tmpFile = assertFile(directory, fileName);
  return exportExcelTitle(tmpFile, sheetName, columnNames, sheetTitle, append);
  }
  /**
  * Excel 导出,POI实现,写入Excel数据行列,与writeExcelTitle配合使用
  * 先使用writeExcelTitle再使用writeExcelData
  *
  * @param directory 目录
  * @param fileName  文件名
  * @param sheetName sheetName
  * @param objects   数据信息
  * @return file
  * @throws ReportInternalException
  * @throws IOException
  */
  public static File writeExcelData(String directory, String fileName, String sheetName, List<List<Object>> objects)
  throws ReportInternalException, IOException {
  File tmpFile = assertFile(directory, fileName);
  return exportExcelData(tmpFile, sheetName, objects);
  }
  /**
  * 导出字符串数据
  *
  * @param file        文件名
  * @param columnNames 表头
  * @param sheetTitle  sheet页Title
  * @param append      是否追加写文件
  * @return file
  * @throws ReportInternalException
  */
  private static File exportExcelTitle(File file, String sheetName, List<String> columnNames,
  String sheetTitle, boolean append) throws ReportInternalException, IOException {
  // 声明一个工作薄
  Workbook workBook;
  if (file.exists() && append) {
  // 声明一个工作薄
  workBook = new HSSFWorkbook(new FileInputStream(file));
  } else {
  workBook = new HSSFWorkbook();
  }
  Map<String, CellStyle> cellStyleMap = styleMap(workBook);
  // 表头样式
  CellStyle headStyle = cellStyleMap.get("head");
  // 生成一个表格
  Sheet sheet = workBook.getSheet(sheetName);
  if (sheet == null) {
  sheet = workBook.createSheet(sheetName);
  }
  //最新Excel列索引,从0开始
  int lastRowIndex = sheet.getLastRowNum();
  if (lastRowIndex > 0) {
  lastRowIndex++;
  }
  // 设置表格默认列宽度
  sheet.setDefaultColumnWidth(DEFAULT_COLUMN_SIZE);
  // 合并单元格
  sheet.addMergedRegion(new CellRangeAddress(lastRowIndex, lastRowIndex, 0, columnNames.size() - 1));
  // 产生表格标题行
  Row rowMerged = sheet.createRow(lastRowIndex);
  lastRowIndex++;
  Cell mergedCell = rowMerged.createCell(0);
  mergedCell.setCellStyle(headStyle);
  mergedCell.setCellValue(new HSSFRichTextString(sheetTitle));
  // 产生表格表头列标题行
  Row row = sheet.createRow(lastRowIndex);
  for (int i = 0; i < columnNames.size(); i++) {
  Cell cell = row.createCell(i);
  cell.setCellStyle(headStyle);
  RichTextString text = new HSSFRichTextString(columnNames.get(i));
  cell.setCellValue(text);
  }
  try {
  OutputStream ops = new FileOutputStream(file);
  workBook.write(ops);
  ops.flush();
  ops.close();
  } catch (IOException e) {
  throw new ReportInternalException(e);
  }
  return file;
  }
  /**
  * 导出字符串数据
  *
  * @param file    文件名
  * @param objects 目标数据
  * @return
  * @throws ReportInternalException
  */
  private static File exportExcelData(File file, String sheetName, List<List<Object>> objects) throws ReportInternalException, IOException {
  // 声明一个工作薄
  Workbook workBook;
  if (file.exists()) {
  // 声明一个工作薄
  workBook = new HSSFWorkbook(new FileInputStream(file));
  } else {
  workBook = new HSSFWorkbook();
  }
  Map<String, CellStyle> cellStyleMap = styleMap(workBook);
  // 正文样式
  CellStyle contentStyle = cellStyleMap.get("content");
  //正文整数样式
  CellStyle contentIntegerStyle = cellStyleMap.get("integer");
  //正文带小数整数样式
  CellStyle contentDoubleStyle = cellStyleMap.get("double");
  // 生成一个表格
  Sheet sheet = workBook.getSheet(sheetName);
  if (sheet == null) {
  sheet = workBook.createSheet(sheetName);
  }
  //最新Excel列索引,从0开始
  int lastRowIndex = sheet.getLastRowNum();
  if (lastRowIndex > 0) {
  lastRowIndex++;
  }
  // 设置表格默认列宽度
  sheet.setDefaultColumnWidth(DEFAULT_COLUMN_SIZE);
  // 遍历集合数据,产生数据行,前两行为标题行与表头行
  for (List<Object> dataRow : objects) {
  Row row = sheet.createRow(lastRowIndex);
  lastRowIndex++;
  for (int j = 0; j < dataRow.size(); j++) {
  Cell contentCell = row.createCell(j);
  Object dataObject = dataRow.get(j);
  if (dataObject != null) {
  if (dataObject instanceof Integer) {
  contentCell.setCellStyle(contentIntegerStyle);
  contentCell.setCellValue(Integer.parseInt(dataObject.toString()));
  } else if (dataObject instanceof Double) {
  contentCell.setCellStyle(contentDoubleStyle);
  contentCell.setCellValue(Double.parseDouble(dataObject.toString()));
  } else if (dataObject instanceof Long && dataObject.toString().length() == 13) {
  contentCell.setCellStyle(contentStyle);
  contentCell.setCellValue(getCnDate(new Date(Long.parseLong(dataObject.toString()))));
  } else if (dataObject instanceof Date) {
  contentCell.setCellStyle(contentStyle);
  contentCell.setCellValue(getCnDate((Date) dataObject));
  } else {
  contentCell.setCellStyle(contentStyle);
  contentCell.setCellValue(dataObject.toString());
  }
  } else {
  contentCell.setCellStyle(contentStyle);
  // 设置单元格内容为字符型
  contentCell.setCellValue("");
  }
  }
  }
  try {
  OutputStream ops = new FileOutputStream(file);
  workBook.write(ops);
  ops.flush();
  ops.close();
  } catch (IOException e) {
  throw new ReportInternalException(e);
  }
  return file;
  }
  /**
  * 导出字符串数据
  *
  * @param file        文件名
  * @param columnNames 表头
  * @param sheetTitle  sheet页Title
  * @param objects     目标数据
  * @param append      是否追加写文件
  * @return
  * @throws ReportInternalException
  */
  private static File exportExcel(File file, String sheetName, List<String> columnNames,
  String sheetTitle, List<List<Object>> objects, boolean append) throws ReportInternalException, IOException {
  // 声明一个工作薄
  Workbook workBook;
  if (file.exists() && append) {
  // 声明一个工作薄
  workBook = new HSSFWorkbook(new FileInputStream(file));
  } else {
  workBook = new HSSFWorkbook();
  }
  Map<String, CellStyle> cellStyleMap = styleMap(workBook);
  // 表头样式
  CellStyle headStyle = cellStyleMap.get("head");
  // 正文样式
  CellStyle contentStyle = cellStyleMap.get("content");
  //正文整数样式
  CellStyle contentIntegerStyle = cellStyleMap.get("integer");
  //正文带小数整数样式
  CellStyle contentDoubleStyle = cellStyleMap.get("double");
  // 生成一个表格
  Sheet sheet = workBook.getSheet(sheetName);
  if (sheet == null) {
  sheet = workBook.createSheet(sheetName);
  }
  //最新Excel列索引,从0开始
  int lastRowIndex = sheet.getLastRowNum();
  if (lastRowIndex > 0) {
  lastRowIndex++;
  }
  // 设置表格默认列宽度
  sheet.setDefaultColumnWidth(DEFAULT_COLUMN_SIZE);
  // 合并单元格
  sheet.addMergedRegion(new CellRangeAddress(lastRowIndex, lastRowIndex, 0, columnNames.size() - 1));
  // 产生表格标题行
  Row rowMerged = sheet.createRow(lastRowIndex);
  lastRowIndex++;
  Cell mergedCell = rowMerged.createCell(0);
  mergedCell.setCellStyle(headStyle);
  mergedCell.setCellValue(new HSSFRichTextString(sheetTitle));
  // 产生表格表头列标题行
  Row row = sheet.createRow(lastRowIndex);
  lastRowIndex++;
  for (int i = 0; i < columnNames.size(); i++) {
  Cell cell = row.createCell(i);
  cell.setCellStyle(headStyle);
  RichTextString text = new HSSFRichTextString(columnNames.get(i));
  cell.setCellValue(text);
  }
  // 遍历集合数据,产生数据行,前两行为标题行与表头行
  for (List<Object> dataRow : objects) {
  row = sheet.createRow(lastRowIndex);
  lastRowIndex++;
  for (int j = 0; j < dataRow.size(); j++) {
  Cell contentCell = row.createCell(j);
  Object dataObject = dataRow.get(j);
  if (dataObject != null) {
  if (dataObject instanceof Integer) {
  contentCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
  contentCell.setCellStyle(contentIntegerStyle);
  contentCell.setCellValue(Integer.parseInt(dataObject.toString()));
  } else if (dataObject instanceof Double) {
  contentCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
  contentCell.setCellStyle(contentDoubleStyle);
  contentCell.setCellValue(Double.parseDouble(dataObject.toString()));
  } else if (dataObject instanceof Long && dataObject.toString().length() == 13) {
  contentCell.setCellType(HSSFCell.CELL_TYPE_STRING);
  contentCell.setCellStyle(contentStyle);
  contentCell.setCellValue(getCnDate(new Date(Long.parseLong(dataObject.toString()))));
  } else if (dataObject instanceof Date) {
  contentCell.setCellType(HSSFCell.CELL_TYPE_STRING);
  contentCell.setCellStyle(contentStyle);
  contentCell.setCellValue(getCnDate((Date) dataObject));
  } else {
  contentCell.setCellType(HSSFCell.CELL_TYPE_STRING);
  contentCell.setCellStyle(contentStyle);
  contentCell.setCellValue(dataObject.toString());
  }
  } else {
  contentCell.setCellStyle(contentStyle);
  // 设置单元格内容为字符型
  contentCell.setCellValue("");
  }
  }
  }
  try {
  OutputStream ops = new FileOutputStream(file);
  workBook.write(ops);
  ops.flush();
  ops.close();
  } catch (IOException e) {
  throw new ReportInternalException(e);
  }
  return file;
  }
  /**
  * 创建单元格表头样式
  *
  * @param workbook 工作薄
  */
  private static CellStyle createCellHeadStyle(Workbook workbook) {
  CellStyle style = workbook.createCellStyle();
  // 设置边框样式
  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);
  // 生成字体
  Font font = workbook.createFont();
  // 表头样式
  style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
  font.setFontHeightInPoints((short) 12);
  font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  // 把字体应用到当前的样式
  style.setFont(font);
  return style;
  }
  /**
  * 创建单元格正文样式
  *
  * @param workbook 工作薄
  */
  private static CellStyle createCellContentStyle(Workbook workbook) {
  CellStyle style = workbook.createCellStyle();
  // 设置边框样式
  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);
  // 生成字体
  Font font = workbook.createFont();
  // 正文样式
  style.setFillPattern(HSSFCellStyle.NO_FILL);
  style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  // 把字体应用到当前的样式
  style.setFont(font);
  return style;
  }
  /**
  * 单元格样式(Integer)列表
  */
  private static CellStyle createCellContent4IntegerStyle(Workbook workbook) {
  CellStyle style = workbook.createCellStyle();
  // 设置边框样式
  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);
  // 生成字体
  Font font = workbook.createFont();
  // 正文样式
  style.setFillPattern(HSSFCellStyle.NO_FILL);
  style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  // 把字体应用到当前的样式
  style.setFont(font);
  style.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0"));//数据格式只显示整数
  return style;
  }
  /**
  * 单元格样式(Double)列表
  */
  private static CellStyle createCellContent4DoubleStyle(Workbook workbook) {
  CellStyle style = workbook.createCellStyle();
  // 设置边框样式
  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);
  // 生成字体
  Font font = workbook.createFont();
  // 正文样式
  style.setFillPattern(HSSFCellStyle.NO_FILL);
  style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  // 把字体应用到当前的样式
  style.setFont(font);
  style.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00"));//保留两位小数点
  return style;
  }
  /**
  * 单元格样式列表
  */
  private static Map<String, CellStyle> styleMap(Workbook workbook) {
  Map<String, CellStyle> styleMap = new LinkedHashMap<>();
  styleMap.put("head", createCellHeadStyle(workbook));
  styleMap.put("content", createCellContentStyle(workbook));
  styleMap.put("integer", createCellContent4IntegerStyle(workbook));
  styleMap.put("double", createCellContent4DoubleStyle(workbook));
  return styleMap;
  }
  }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-427651-1-1.html 上篇帖子: 爬虫 htmlUnit遇到Cannot locate declared field class org.apache.http.impl.client.Http 下篇帖子: 【跟我学apache-commons】【四】commons-io的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表