JAVA Excel导入导出
--------------------------------------------方式一(新)-----------------------------------------------------------------
这个导出excel是需要excel模板文件,这个方式的好处是可以自定义excel的表头,方式如下:
1.复制该工具类
import net.sf.jxls.exception.ParsePropertyException;
import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map; public class ExcelTemplateUtils {
/**
*
* @param filename 导出的文件名
* @param dataMap List的集合
* @param model
* @param response
* @throws IOException
*/
@SuppressWarnings("rawtypes")
public void export(String filename, Map<String,List>dataMap, String model, HttpServletResponse response){
XLSTransformer transformer = new XLSTransformer();
HSSFWorkbook workbook;
InputStream in;
try {
//此方法需要类与模板放在同一目录下
in = Thread.currentThread().getContextClassLoader().getResourceAsStream(model);
// in = getClass().getResourceAsStream(model);
workbook = transformer.transformXLS(in, dataMap);
outExcel(workbook, response, filename);
} catch (Exception e) {
e.printStackTrace();
}
} protected void outExcel(HSSFWorkbook workbook, HttpServletResponse response,
String filename) throws UnsupportedEncodingException {
response.setContentType("application ns.ms-excel");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setHeader("Content-disposition", "attachment;filename="+new String(filename.getBytes("utf-8"),"iso-8859-1")+".xls"); try {
workbook.write(response.getOutputStream());
} catch (ParsePropertyException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.自定义excel模板文件:(不能插入excel文件,所以截图了,如图所示)

3.导出请求代码:
@GetMapping("/export")
public void excelTemplate(String startDate, String endDate, String email, HttpServletResponse response) {
FinancialReq req = new FinancialReq();
req.setEmail(email);
req.setStartDate(startDate);
req.setEndDate(endDate);
List list = adminFinancialService.findExcelList(req);
Map<String, List> beanParams = new HashMap<String, List>();
beanParams.put("financialSummary", list);
ExcelTemplateUtils excel = new ExcelTemplateUtils();
StringBuilder title = new StringBuilder();
title.append("财务统计报表");
title.append(DateUtils.formatDate(new Date(),"yyyyMMddhhmmss"));
excel.export(title.toString(), beanParams, "template_financialSummary.xls", response);
}
--------------------------------------------方式二(旧)----------------------------------------------------------------
导入架包:
gradle(
"org.apache.poi:poi-ooxml:3.16",
)
下面给出一个Excel导入导出的工具类:
package com.glory.venus.common.utils; import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; /**
* @author me
* @date 2017-06-08 16:29:25
*/
public class ExcelUtil { /**
* 生成2007及以后版本
* @param list 数据集合
* @param title 表头 表头名称的顺序要与list里的object属性的顺序对应
* @param sheetName sheet名称
* @return
*/
public static Workbook getXSSFWorkbook(List<Object> list,String[] title,String sheetName){
Workbook wb = new XSSFWorkbook();//2007及以后版本 .xslx
return createExcel(wb,list,title,sheetName,0,0);
} /**
* 2003及以前的版本
* @param list 数据集合
* @param title 表头 表头名称的顺序要与list里的object属性的顺序对应
* @param sheetName sheet名称
* @return
*/
public static Workbook getHSSFWorkbook(List<Object> list,String[] title,String sheetName){
Workbook wb = new HSSFWorkbook();//2003及以前的版本 .xsl
return createExcel(wb,list,title,sheetName,0,0);
} /**
* 生成Excel文件
* @param list 数据集合
* @param title 表头
* @param sheetName sheet名称
* @param rowNum 从第几行开始写入
* @param colNum 从第几列开始写入
* @return
*/
private static Workbook createExcel(Workbook wb,List list,String[] title,String sheetName,int rowNum,int colNum) {
if(sheetName == null || "".equals(sheetName)){
sheetName = "sheet1";
}
Sheet sheet = wb.createSheet(sheetName);
Row topRow = sheet.createRow(rowNum);
for (int i = 0; i < title.length; i++) {
sheet.autoSizeColumn(i,true);
topRow.createCell(i+colNum).setCellValue(title[i]);
}
if(list == null || list.size() == 0){
return wb;
}
Object[] objs = null;
for (int i = 0; i < list.size(); i++) {
rowNum++;
Row row = sheet.createRow(rowNum);
objs = getFieldValues(list.get(i));
for (int j = 0; j < objs.length; j++) {
String value = objs[j] == null ? "" : objs[j].toString();
row.createCell(j+colNum).setCellValue(value);
}
}
return wb;
} /**
* 获取对象属性的值
* @param o
* @return
*/
private static Object[] getFieldValues(Object o) {
Object[] value = null;
try {
Field[] fields = o.getClass().getDeclaredFields();
value = new Object[fields.length];
for (int i = 0; i < fields.length; i++) {
String firstLetter = fields[i].getName().substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fields[i].getName().substring(1);
Method method = o.getClass().getMethod(getter, new Class[] {});
value[i] = method.invoke(o, new Object[] {});
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} return value;
} /**
* 获取对象属性名称
* @param o
* @return
*/
private static String[] getFieldValue(Object o) {
Field[] fields = o.getClass().getDeclaredFields();
String[] value = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
value[i] = fields[i].getName();
}
return value;
} /**
* 读取Excel
* @param is Excel的文件流
* @return
*/
public static ExcelCellBean readExcel(InputStream is){
Workbook workbook = null;
Sheet sheet = null;
try {
workbook = WorkbookFactory.create(is);
sheet = workbook.getSheetAt(0); //读取第几个工作表sheet
int rowNum = sheet.getLastRowNum();//有多少列
ExcelCellBean eb = new ExcelCellBean();
String[] title = new String[0];
String[] value = new String[0];
List<String[]> values = new ArrayList<String[]>();
int c = 0;//用去区分表头和数值
int colNum = 0;//总共有多少列
int firstCellNum = 0;//第几列开始读取
for(int k = 0;k <= rowNum;k++){
Row row = sheet.getRow(k);//从第几行开始读
if(row == null){//过滤空行
continue;
}
if(c == 0){
firstCellNum = row.getFirstCellNum();
colNum = row.getLastCellNum() - row.getFirstCellNum();
title = new String[colNum];
}else{
value = new String[colNum];
}
int count = 0;//计算放进数值里面的顺序
for (int i = firstCellNum; i < colNum+firstCellNum; i++) {
if(c == 0){
title[count] = getCellFormatValue(row.getCell(i));
}else{
value[count] = getCellFormatValue(row.getCell(i));
}
count++;
}
if(c > 0){
values.add(value);
}
c++;
}
eb.setTitle(title);
eb.setValues(values);
return eb;
} catch (IOException e) {
e.printStackTrace();
} catch (EncryptedDocumentException e) {
e.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
}
return null;
} /**
* 从cell获取值
* @param cell
* @return
*/
private static String getCellFormatValue(Cell cell) {
String cellvalue = "";
if(cell != null){
switch (cell.getCellTypeEnum()) {
case NUMERIC:
if(DateUtil.isCellDateFormatted(cell)){//日期类型
cellvalue = cell.getDateCellValue() + "";
}else{
cellvalue = String.valueOf(cell.getNumericCellValue());
}
break;
case BOOLEAN:
cellvalue = cell.getBooleanCellValue() + "";
break;
case FORMULA:
cellvalue = "公式";
break;
case ERROR:
cellvalue = cell.getErrorCellValue() + "";
break;
// case BLANK://空白
// case STRING:
default:
cellvalue = cell.getStringCellValue();
break;
}
}
return cellvalue;
} }
备注;设计到文件的上传,需要的jar:
gradle(
"commons-fileupload:commons-fileupload:1.3.1",""
)
另外 还需要配置一个bean :不然强转 request为MultipertRequest的时候 会出错
@Bean(name = "multipartResolver")
public CommonsMultipartResolver commonsMultipartResolver() {
logger.info("CommonsMultipartResolver");
return new CommonsMultipartResolver();
}
后台 导入、导出Excel 请求 可参考一下代码:
@RequestMapping(value = "/sport/export", method = RequestMethod.GET)
public void sportExport(HttpServletResponse response) throws IOException {
String[] titles = new String[]{"模板编码", "运动名称", "运动类型", "运动时间", "运动频率", "运动周期", "运动强度", "创建时间", "创建人"};
String sheetName = "运动模板";
List list = service.findAllTemplateSportExcel();
Workbook workbook = ExcelUtil.getXSSFWorkbook(list, titles, sheetName);
OutputStream output = response.getOutputStream();
response.reset();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(sheetName + ".xls", "UTF-8"));
workbook.write(output);
output.close();
} @RequestMapping(value = "/sport/import", method = RequestMethod.POST)
public ResponseBean sportImport(HttpServletRequest request) throws IOException {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
Long creator=1l;//// TODO: 2017-06-27 获取管理员ID
Iterator<String> iterator = multipartRequest.getFileNames();
while(iterator.hasNext()){
MultipartFile multipartFile = multipartRequest.getFile(iterator.next());
if(multipartFile != null){
ExcelCellBean bean=ExcelUtil.readExcel(multipartFile.getInputStream());
return service.importTemplateSport(creator,bean);
}
}
return new ResponseBean(-1,"获取上传文件失败");
}
JAVA Excel导入导出的更多相关文章
- Java Excel 导入导出(一)
本文主要描述通过java实现Excel导入导出 一.读写Excel三种常用方式 1.JXL——Java Excel开放源码项目:读取,创建,更新 2.POI——Apache POI ,提供API给Ja ...
- Java Excel导入导出(实战)
一.批量导入(将excel文件转成list) 1. 前台代码逻辑 1)首先在html页面加入下面的代码(可以忽略界面的样式) <label for="uploadFile" ...
- java Excel导入导出工具类
本文章,导入导出依赖提前定义好的模板 package com.shareworx.yjwy.utils; import java.io.File; import java.io.FileInputSt ...
- Java Excel 导入导出(二)
本文主要叙述定制导入模板——利用XML解析技术,确定模板样式. 1.确定模板列 2.定义标题(合并单元格) 3.定义列名 4.定义数据区域单元格样式 引入jar包: 一.预期格式类型 二.XML模板格 ...
- Java——excel导入导出demo
1. java导入 package xx; import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.userm ...
- java简易excel导入导出工具(封装POI)
Octopus 如何导入excel 如何导出excel github项目地址 Octopus Octopus 是一个简单的java excel导入导出工具. 如何导入excel 下面是一个excel文 ...
- Java 使用 Jxl 实现 Excel 导入导出
开发过程中经常需要用到数据的导入导出功能,之前用的是POI,这次使用JXL,JXL相对于POI来说要轻量简洁许多,在数据量不大的情况下还是非常实用的.这里做一下使用JXL的学习记录.首先需要导入相应的 ...
- java jxl excel 导入导出的 总结(建立超链接,以及目录sheet的索引)
最近项目要一个批量导出功能,而且要生成一个单独的sheet页,最后后面所有sheet的索引,并且可以点击进入连接.网上搜索了一下,找到一个方法,同时把相关的excel导入导出操作记录一下!以便以后使用 ...
- JAVA实现Excel导入/导出【转】
JAVA实现Excel导入/导出[转] POI的下载与安装 请到网站http://www.apache.org/dyn/closer.cgi/poi/右击超链接2.5.1.zip下载压缩包poi-bi ...
随机推荐
- Scala之模式匹配(Patterns Matching)
前言 首先.我们要在一開始强调一件非常重要的事:Scala的模式匹配发生在但绝不仅限于发生在match case语句块中.这是Scala模式匹配之所以重要且实用的一个关键因素!我们会在文章的后半部分具 ...
- 关于 UIWebView 的说明
本文转载至 http://blog.csdn.net/cyforce/article/details/8487856 1.UIWebDocumentView 2.WebView 3. //====== ...
- python发送邮件(yagmail模块)
import yagmail user = 'xxxx@qq.com' passwd = 'xxxx' # 授权码,不是密码,需要在邮箱中设置,看邮箱类型,有的需要设置 res = yagmail.S ...
- [Spring MVC]学习笔记--form表单标签的使用
github例子地址: https://github.com/lemonbar/spring-mvc-jsp 效果图 关于spring mvc的标签的讲解, 有一篇blog已经讲的很细了. http: ...
- 巨蟒python全栈开发django8:基于对象和基于双下划线的多表查询
1.编辑删除&&多对多关系的其他方法 提交,数据,得到结果 查看运行 给编辑和删除,添加样式 我们点击删除,可以成功删除 打印sql语句的,在settings.py里边的配置 LOGG ...
- 好的commit应该长啥样 https://github.com/torvalds/linux/pull/17#issuecomment-5654674
Git commits历史是如何做到如此清爽的? - 知乎 https://www.zhihu.com/question/61283395/answer/186122300 尤雨溪 前端开发.Java ...
- JdbcUtils 小工具
// 第一版 // src 目录下 dbconfig.properties 配置文件, 用来配置四大参数 // 注意 properties 配置文件中没有分号结尾, 也没有引号 driverClass ...
- C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方法(gcc使用zh_CN.GBK,或者zh_CN.UTF-8,VC++使用Chinese_People's Republic of China.936或者65001.)
转自:http://zyxhome.org/wp/cc-prog-lang/c-stdlib-setlocale-usage-note/ [在此向原文作者说声谢谢!若有读者看到文章转载时请写该转载地址 ...
- Python3.6全栈开发实例[009]
9.字典dic,dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}a.请循 ...
- 提交cookie登录
# coding:utf-8import requests # 先打开登录首页,获取部分cookieurl = "https://passport.cnblogs.com/user/sign ...