java 注解方式 写入数据到Excel文件中
之前有写过一点关于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文件中的更多相关文章
- java 写入数据到Excel文件中_Demo
=======第一版:基本功能实现======= import com.google.common.collect.Maps; import org.apache.log4j.Logger; impo ...
- Java读取、写入、处理Excel文件中的数据(转载)
原文链接 在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,本文将介绍Excel读写的常用方法,希望对大家学习Java读写Ex ...
- 写入数据到Plist文件中时,第一次要创建一个空的数组,否则写入文件失败
#pragma mark - 保存数据到本地Plist文件中 - (void)saveValidateCountWithDate:(NSString *)date count:(NSString *) ...
- 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转
效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载]) 本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较 ...
- Python:将爬取的网页数据写入Excel文件中
Python:将爬取的网页数据写入Excel文件中 通过网络爬虫爬取信息后,我们一般是将内容存入txt文件或者数据库中,也可以写入Excel文件中,这里介绍关于使用Excel文件保存爬取到的网页数据的 ...
- Python学习笔记_从CSV读取数据写入Excel文件中
本示例特点: 1.读取CSV,写入Excel 2.读取CSV里具体行.具体列,具体行列的值 一.系统环境 1. OS:Win10 64位英文版 2. Python 3.7 3. 使用第三方库:csv. ...
- Java使用POI实现数据导出excel报表
Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...
- java代码将excel文件中的内容列表转换成JS文件输出
思路分析 我们想要把excel文件中的内容转为其他形式的文件输出,肯定需要分两步走: 1.把excel文件中的内容读出来: 2.将内容写到新的文件中. 举例 一张excel表中有一个表格: 我们需要将 ...
- 批量处理txt文本文件到Excel文件中去----java
首发地址:http://blog.csdn.net/u014737138/article/details/38120403 不多说了 直接看代码: 下面的FileFind类首先是找到文件夹下面所有的t ...
随机推荐
- css 制作一个点
aside li a:before { content: ''; display: inline-block; width: 4px; height: 4px; background-color: # ...
- 前端使用 node-gyp 构建 Native Addon
前端轮子千千万, 但还是有些瓶颈, 公司需要在前端调用自有 tcp 协议, 该协议只有 c++ 的封装版本. 领导希望可以直接调该模块, 不要重复造轮子. 实话说我对 C 还有点印象, 毕竟也是有二级 ...
- LoadRunner(3)
一.性能测试的策略 重要的:基准测试.并发测试.在线综合场景测试 递增测试.极限测试... 1.基准测试:Benchmark Testing 含义:就是单用户测试,单用户.单测试点.执行n次: 作为后 ...
- 牛客练习赛42 C 出题的诀窍 (贡献,卡常)
牛客练习赛42 C 出题的诀窍 链接:https://ac.nowcoder.com/acm/contest/393/C来源:牛客网 题目描述 给定m个长为n的序列a1,a2,-,ama_1 , a_ ...
- 双端队列 C. Vasya and String
High school student Vasya got a string of length n as a birthday present. This string consists of le ...
- Linux之df磁盘信息
df命令用于查看磁盘的分区,磁盘已使用的空间,剩余的空间 1.用法 df [选项] [文件..] 2.命令选项 -a,--all 全部文件系统-h,--human-readable 以以合适的单位来显 ...
- 转:SpringBoot 自定义异常@ContollerAdvice ExceptionHandler不起作用
原文链接:https://blog.csdn.net/evanxuhe/article/details/78650979 为了统一异常,我们通常定义一个统一管理所有Exception,包括自定义Exc ...
- mysql5.7安装中的问题(服务无法启动。服务没有报告任何错误。排查方法)
1.拒绝访问的问题 权限不够,必须以管理员身份启动命令行 2.MySQL 服务无法启动.服务没有报告任何错误. 进入到你的mysql安装目录,C:\Program Files\MySQL\MySQL ...
- Java笔记(基础第四篇)
Java集合类 集合类概述 Java 语言的java.util包中提供了一些集合类,这些集合类又被称为容器.常用的集合有List集合.Set集合.Map集合,其中List与Set实现了Collecti ...
- docker化canal与canal-adapter
今日公司需求,需要将mysql更新实时同步到kafka中,后来又要将数据库中的一张表的变化实时同步到另一台mysql中,于是乎canal与canal-adapter紧急解决,其中踩了不少坑,下面为总结 ...