之前有写过一点关于java实现写Excel文件的方法,但是现在看来,那种方式用起来不是太舒服,还很麻烦。所以最近又参考其他,就写了一个新版,用起来不要太爽。

代码不需要解释,惯例直接贴下来:

 public class ExcelExport implements Closeable {

     private static final Logger LOGGER = LoggerFactory.getLogger(ExcelExport.class);

     public static final String EXCEL_SUFFIX = ".xlsx"; // 目前只支持xlsx格式

     private static final String SHEET_FONT_TYPE = "Arial";

     private Workbook workbook;

     private Sheet sheet;

     private int rowNum;

     private Map<String, CellStyle> styles;

     private List<ColumnField> columns;

     public ExcelExport createSheet(String sheetName, String title, Class<?> clazz) throws Exception {
this.workbook = createWorkbook();
this.columns = createColumns();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
ExcelField excelField = field.getAnnotation(ExcelField.class);
if (excelField != null) {
this.columns.add(new ColumnField(excelField.title(), field.getName(), field.getType(), excelField.width()));
}
}
if (CollectionUtils.isEmpty(this.columns)) throw new Exception("Excel's headerList are undefined");
this.sheet = workbook.createSheet(StringUtils.defaultString(sheetName, StringUtils.defaultString(title, "Sheet1")));
this.styles = createStyles(workbook);
this.rowNum = 0;
if (StringUtils.isNotBlank(title)) {
Row titleRow = sheet.createRow(rowNum++);
titleRow.setHeightInPoints(30);
Cell titleCell = titleRow.createCell(0);
titleCell.setCellStyle(styles.get("title"));
titleCell.setCellValue(title);
sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(),
this.columns.size() - 1));
}
Row headerRow = sheet.createRow(rowNum++);
headerRow.setHeightInPoints(16);
for (int i = 0; i < this.columns.size(); i++) {
int width = this.columns.get(i).width;
this.sheet.setColumnWidth(i, 256 * width + 184);
Cell cell = headerRow.createCell(i);
cell.setCellStyle(styles.get("header"));
cell.setCellValue(this.columns.get(i).title);
}
return this;
} public <E> ExcelExport setDataList(List<E> dataList) throws IllegalAccessException {
for (E data : dataList) {
int column = 0;
Row row = this.addRow();
Map<String, Object> map = toMap(data);
for (ColumnField field : this.columns) {
Class<?> paramType = field.getParamType();
if (map.containsKey(field.getParam())) {
Object value = map.get(field.getParam());
this.addCell(row, column++, value, paramType);
}
}
}
LOGGER.debug("add data into {} success", this.sheet.getSheetName());
return this;
} private Cell addCell(Row row, int column, Object value, Class<?> type) {
Cell cell = row.createCell(column);
if (value == null) {
cell.setCellValue("");
} else if (type.isAssignableFrom(String.class)) {
cell.setCellValue((String) value);
} else if (type.isAssignableFrom(Integer.class)) {
cell.setCellValue((Integer) value);
} else if (type.isAssignableFrom(Double.class)) {
cell.setCellValue((Double) value);
} else if (type.isAssignableFrom(Long.class)) {
cell.setCellValue((Long) value);
} else if (type.isAssignableFrom(Float.class)) {
cell.setCellValue((Float) value);
} else if (type.isAssignableFrom(Date.class)) {
Date time = (Date) value;
String timer = DateUtils.formatDate(time, "yyyy-MM-dd HH:mm:ss");
cell.setCellValue(timer);
} else {
cell.setCellValue(Objects.toString(value));
}
cell.setCellStyle(styles.get("data"));
return cell;
} private Map<String, Object> toMap(Object entity) throws IllegalAccessException {
Map<String, Object> row = Maps.newHashMap();
if (null == entity) return row;
Class clazz = entity.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
row.put(field.getName(), field.get(entity));
}
return row;
} private Row addRow() {
return sheet.createRow(rowNum++);
} public ExcelExport write(OutputStream os) {
try {
workbook.write(os);
} catch (IOException ex) {
LOGGER.error(ex.getMessage(), ex);
} finally {
if (null != os) {
try {
os.close();
} catch (IOException e) {
LOGGER.error("close Output Stream failed: {}", e.getMessage());
}
}
}
return this;
} public ExcelExport write(HttpServletResponse response, String fileName) {
response.reset();
try {
response.setContentType("application/octet-stream; charset=utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, UTF8));
write(response.getOutputStream());
} catch (IOException ex) {
LOGGER.error(ex.getMessage(), ex);
}
return this;
} public ExcelExport writeFile(String name) throws IOException {
FileOutputStream os = new FileOutputStream(name);
this.write(os);
return this;
} private Workbook createWorkbook() {
return new SXSSFWorkbook();
} private List<ColumnField> createColumns() {
return Lists.newLinkedList();
} private Map<String, CellStyle> createStyles(Workbook workbook) {
Map<String, CellStyle> styleMap = Maps.newHashMap(); CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
Font titleFont = workbook.createFont();
titleFont.setFontName(SHEET_FONT_TYPE);
titleFont.setFontHeightInPoints((short) 16);
titleFont.setBold(true);
style.setFont(titleFont);
styleMap.put("title", style); style = workbook.createCellStyle();
style.setVerticalAlignment(VerticalAlignment.CENTER);
style.setBorderRight(BorderStyle.THIN);
style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
style.setBorderLeft(BorderStyle.THIN);
style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
style.setBorderTop(BorderStyle.THIN);
style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
style.setBorderBottom(BorderStyle.THIN);
style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
Font dataFont = workbook.createFont();
dataFont.setFontName(SHEET_FONT_TYPE);
dataFont.setFontHeightInPoints((short) 10);
style.setFont(dataFont);
styleMap.put("data", style); style = workbook.createCellStyle();
style.cloneStyleFrom(styleMap.get("data"));
style.setWrapText(true);
style.setAlignment(HorizontalAlignment.CENTER);
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
Font headerFont = workbook.createFont();
headerFont.setFontName(SHEET_FONT_TYPE);
headerFont.setFontHeightInPoints((short) 10);
headerFont.setBold(true);
headerFont.setColor(IndexedColors.WHITE.getIndex());
style.setFont(headerFont);
style.setBorderRight(BorderStyle.THIN);
styleMap.put("header", style); return styleMap;
} public Workbook getWorkbook() {
return workbook;
} public void setWorkbook(Workbook workbook) {
this.workbook = workbook;
} public Sheet getSheet() {
return sheet;
} public void setSheet(Sheet sheet) {
this.sheet = sheet;
} public int getRowNum() {
return rowNum;
} public void setRowNum(int rowNum) {
this.rowNum = rowNum;
} public Map<String, CellStyle> getStyles() {
return styles;
} public void setStyles(Map<String, CellStyle> styles) {
this.styles = styles;
} public List<ColumnField> getColumns() {
return columns;
} public void setColumns(List<ColumnField> columns) {
this.columns = columns;
} @Override
public void close() throws IOException {
if (workbook instanceof SXSSFWorkbook && ((SXSSFWorkbook) workbook).dispose())
workbook.close();
} class ColumnField {
private String title;
private String param;
private Class<?> paramType;
private int width; ColumnField(String title, String param, Class<?> paramType, int width) {
this.title = title;
this.param = param;
this.paramType = paramType;
this.width = width;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getParam() {
return param;
} public void setParam(String param) {
this.param = param;
} public Class<?> getParamType() {
return paramType;
} public void setParamType(Class<?> paramType) {
this.paramType = paramType;
} public int getWidth() {
return width;
} public void setWidth(int width) {
this.width = width;
}
}
}

以下是两个注解

 @Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelField { /**
* 导出字段标题
*/
String title(); /**
* 列宽
*/
int width() default 10; // 后面还可以添加其他的属性,添加后再修改上面那个代码就行了
}

以上。

使用方式为:

 import com.xxx.utils.ExcelField;

 public class ExcelDataModel {

     @ExcelField(title = "ID", width = 4)
private String id; @ExcelField(title = "序号", width = 4)
private Integer serial; @ExcelField(title = "名字", width = 8)
private String name;
13 ... (getter\setter)
    @GetMapping(value = "export/post")
public void exportPost(@ModelAttribute RequestModel model, HttpServletResponse response) {
try (
ExcelExport excelExport = new ExcelExport();
OutputStream out = response.getOutputStream()
) {
List<ExcelDataModel> data = xxxService.selectExportData(model);
response.setContentType("octets/stream");
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("xx列表", "UTF-8")
+ DateUtils.formatDate(new Date(), "yyyyMMddHHmmss") + ExcelExport.EXCEL_SUFFIX);
String title = "xx列表";
excelExport.createSheet("xx列表", title, ExcelDataModel.class);
excelExport.setDataList(data);
excelExport.write(out);
} catch (Exception e) {
e.printStackTrace();
}
}

over.

java 注解方式 写入数据到Excel文件中的更多相关文章

  1. java 写入数据到Excel文件中_Demo

    =======第一版:基本功能实现======= import com.google.common.collect.Maps; import org.apache.log4j.Logger; impo ...

  2. Java读取、写入、处理Excel文件中的数据(转载)

    原文链接 在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,本文将介绍Excel读写的常用方法,希望对大家学习Java读写Ex ...

  3. 写入数据到Plist文件中时,第一次要创建一个空的数组,否则写入文件失败

    #pragma mark - 保存数据到本地Plist文件中 - (void)saveValidateCountWithDate:(NSString *)date count:(NSString *) ...

  4. 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转

    效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载])    本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较   ...

  5. Python:将爬取的网页数据写入Excel文件中

    Python:将爬取的网页数据写入Excel文件中 通过网络爬虫爬取信息后,我们一般是将内容存入txt文件或者数据库中,也可以写入Excel文件中,这里介绍关于使用Excel文件保存爬取到的网页数据的 ...

  6. Python学习笔记_从CSV读取数据写入Excel文件中

    本示例特点: 1.读取CSV,写入Excel 2.读取CSV里具体行.具体列,具体行列的值 一.系统环境 1. OS:Win10 64位英文版 2. Python 3.7 3. 使用第三方库:csv. ...

  7. Java使用POI实现数据导出excel报表

    Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...

  8. java代码将excel文件中的内容列表转换成JS文件输出

    思路分析 我们想要把excel文件中的内容转为其他形式的文件输出,肯定需要分两步走: 1.把excel文件中的内容读出来: 2.将内容写到新的文件中. 举例 一张excel表中有一个表格: 我们需要将 ...

  9. 批量处理txt文本文件到Excel文件中去----java

    首发地址:http://blog.csdn.net/u014737138/article/details/38120403 不多说了 直接看代码: 下面的FileFind类首先是找到文件夹下面所有的t ...

随机推荐

  1. DB2 alter 新增/删除/修改列

    SQL语句 增加列.修改列.删除列 1 添加字段 语法 : alter table 表名称 add 字段名称 类型 demo: alter table tableName add columnName ...

  2. 一图一知-NPM&YARN常用命令

  3. java线程基础巩固---如何实现一个自己的显式锁Lock

    拋出synchronized问题: 对于一个方法上了同锁如果被一个线程占有了,而假如该线程长时间工作,那其它线程不就只能傻傻的等着,而且是无限的等这线程工作完成了才能执行自己的任务,这里来演示一下这种 ...

  4. C#中 委托和事件的关系

    首先,委托 是一个好东西.按我的理解,委托 是针对 方法 的更小粒度的抽象.比较interface,他精简了一些代码.使得 订阅-通知 (观察者模式)的实现变得非常简洁. 关于事件,我最初的理解是:事 ...

  5. CentOS7 内核优化 修改参数

    一:内核简介 内核是操作系统最基本的部分.它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间. 内核的分类可分为单内核和 ...

  6. ak-1

    最近研究ak,网上也有很多这方面的资料,就不重复叙述了,本次记录就是自己在做适应时的一些记录. 本次环境 中标麒麟  金蝶apusic 人大金仓 先说说东西从哪下载怎么来的 基本都是通过官网打电话申请 ...

  7. BZOJ 1453 (线段树+并查集)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1453 题意:一个 n*n 的矩阵,每个位置有黑/白两种颜色,有 m 次操作,每次可以翻转 ...

  8. Elasticsearch 读时分词、写时分词

    初次接触 Elasticsearch 的同学经常会遇到分词相关的难题,比如如下这些场景: 为什么明明有包含搜索关键词的文档,但结果里面就没有相关文档呢?我存进去的文档到底被分成哪些词(term)了?我 ...

  9. 将.py脚本打包成.exe

    https://www.cnblogs.com/wyl-0120/p/10823102.html 为了方便使用,通过pyinstaller对脚本进行打包成exe文件. pip3 install pyi ...

  10. 收藏一个RMQ模板

    int a[1100]; int dp[maxn][20]; void rmq_init(){ for(int i=0;i<n;i++) dp[i][0]=a[i]; for(int j=1;( ...