java Excel导入导出工具类
本文章,导入导出依赖提前定义好的模板
package com.jd.nb.wishplat.man.util; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
*
* @author zhenwei.shi
*
*/
public class ImpAndExpExcel { public static JSONArray doImpXlsx(MultipartFile file, String[] fields, String[] requiredFields, Integer docReadStartRowIndex) throws IOException {
XSSFWorkbook wb = new XSSFWorkbook(file.getInputStream()); JSONArray jsonArray = new JSONArray();
int startRowIndex = (null == docReadStartRowIndex?2:docReadStartRowIndex); XSSFSheet sheet = wb.getSheetAt(0); // 遍历所有行记录,sheet.getLastRowNum()获取的是最后一行的index
for (int startRow = startRowIndex; startRow <= sheet.getLastRowNum(); startRow++) {
// 遍历记录所有列
JSONObject jsonObj = new JSONObject();
boolean isErrorObj = false; for (int columnIndex = 0; columnIndex < fields.length; columnIndex++) {
XSSFCell nowCell = getXssfCell(sheet, startRow, columnIndex);
String cellValue = getXssfCellValue(nowCell);
if(isRequired(fields[columnIndex],requiredFields) && StringUtils.isEmpty(cellValue)){
isErrorObj = true;
break;
}
jsonObj.put(fields[columnIndex], cellValue);
} if(!isErrorObj){
jsonArray.add(jsonObj);
}
}
wb.close();
return jsonArray;
} /**
* 导入03版Excel .xls
* 依据上传文件返还JSON数组对象,JSON属性为heads
* @param file 导入的文件
* @param heads 定义对象的列名
* @param rowStartIndex 从第几行开始读取
* @return
* @throws IOException
*/
@SuppressWarnings("resource")
public static JSONArray doImpXls(MultipartFile file, String[] fields, Integer docReadStartRowIndex) throws IOException {
POIFSFileSystem fs = new POIFSFileSystem(file.getInputStream());
HSSFWorkbook wb = new HSSFWorkbook(fs); JSONArray jsonArray = new JSONArray();
int startRowIndex = (null == docReadStartRowIndex?2:docReadStartRowIndex); HSSFSheet sheet = wb.getSheetAt(0);//只导入sheet第一页 // 遍历所有行记录,sheet.getLastRowNum()获取的是最后一行的index
for (int startRow = startRowIndex; startRow <= sheet.getLastRowNum(); startRow++) {
// 遍历记录所有列
JSONObject jsonObj = new JSONObject();
boolean isBlankObj = true;
for (int columnIndex = 0; columnIndex < fields.length; columnIndex++) {
HSSFCell nowCell = getHssfCell(sheet, startRow, columnIndex, true);
String value = getHssfCellStringValue(nowCell);
if(null!=value){
value=value.trim();
}
jsonObj.put(fields[columnIndex], value);
if(!StringUtils.isEmpty(value) && !"0".equals(value)){
isBlankObj = false;
}
} if(!isBlankObj){
jsonArray.add(jsonObj);
}
}
return jsonArray;
} /**
* 导出03版Excel .xls
* @param object//导出对象,可以是数组可以是对象
* @param fields//要导出对象的所需要的属性,注意跟模板书序一直
* @param docTemplatePath 如 1:/D:/saw_workspace/property/property-manage-ui/target/classes//templates/supplier/设施设备管理导入模板.xls
* 2:/templates/supplier/供应商管理导入模板.xls
* docTemplatePath = this.getClass().getResource("/").getPath()+/templates/supplier/供应商管理导入模板.xls";
* @param docWriteStartRowIndex//从模板第几行开始写入
* @return
* @throws FileNotFoundException
* @throws IOException
*/
public static void doExpXls(Object object,String[] fields,String docTemplatePath,Integer docWriteStartRowIndex) throws IOException{
doExpXls(object, fields, docTemplatePath, docWriteStartRowIndex,null);
} /**
* 导出03版Excel .xls
* @param object//导出对象,可以是数组可以是对象
* @param fields//要导出对象的所需要的属性,注意跟模板书序一直
* @param docTemplatePath 如 1:/D:/saw_workspace/property/property-manage-ui/target/classes//templates/supplier/设施设备管理导入模板.xls
* 2:/templates/supplier/供应商管理导入模板.xls
* docTemplatePath = this.getClass().getResource("/").getPath()+/templates/supplier/供应商管理导入模板.xls";
* @param docWriteStartRowIndex//从模板第几行开始写入
* @param sheetRowsCount//sheet页数据最大行数
* @return
* @throws IOException
*/
@SuppressWarnings("resource")
public static void doExpXls(Object object,String[] fields,String docTemplatePath,Integer docWriteStartRowIndex,Integer sheetRowsCount) throws IOException{
docTemplatePath = docTemplatePath.replaceAll("\\\\", "/");
String projectPath = ImpAndExpExcel.class.getResource("/").getPath().replaceAll("\\\\", "/");
if(!docTemplatePath.contains(projectPath)){
docTemplatePath = projectPath+"/"+docTemplatePath;
}
FileInputStream inputStream = new FileInputStream(new File(docTemplatePath));; HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(inputStream)); JSONArray jsonArr = (JSONArray) JSONArray.toJSON(object);
int everyCount = null==sheetRowsCount?50000:sheetRowsCount;
int pageCount = (int)Math.ceil(jsonArr.size()/(everyCount*1.0));
//创建SHEET页
for(int i=0; i<pageCount; i++){
HSSFSheet sheet = null;
if(0==i){
sheet = workbook.getSheetAt(0);
}else{
sheet = workbook.cloneSheet(0);
} int index = workbook.getSheetIndex(sheet);
workbook.setSheetName(index, "第"+(i+1)+"页");
workbook.setSheetOrder(sheet.getSheetName(), i);
}
//sheet页赋值数据
for(int i=0; i<pageCount; i++){
int startIndex = i*everyCount;
int endIndex = startIndex+everyCount;
if(i==pageCount-1){
endIndex = jsonArr.size();
}
JSONArray subjsonArr = (JSONArray)JSONArray.toJSON(jsonArr.subList(startIndex, endIndex));
int startRowIndex = (null == docWriteStartRowIndex?2:docWriteStartRowIndex); HSSFSheet sheet = workbook.getSheetAt(i); for (int j = 0; j < subjsonArr.size(); j++,startRowIndex++) {
JSONObject jsonObj = subjsonArr.getJSONObject(j);
for (int colIndex = 0; colIndex < fields.length; colIndex++) {
HSSFCell tempCell = getHssfCell(sheet, startRowIndex, colIndex, true);
tempCell.setCellValue(jsonObj.getString(fields[colIndex]));
}
}
} ServletOutputStream out = null;
String excName = docTemplatePath.substring(docTemplatePath.lastIndexOf("/")+1);
try {
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/octet-stream; charset=UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=\""+new String(excName.getBytes("GB2312"),"ISO8859-1")+"\";");//
out = response.getOutputStream();
workbook.write(out);
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
out.close();
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} /**
* 获取导出03版Excel .xls的workbook
* @param object//导出对象,可以是数组可以是对象
* @param fields//要导出对象的所需要的属性,注意跟模板书序一直
* @param docTemplatePath 如 1:/D:/saw_workspace/property/property-manage-ui/target/classes//templates/supplier/设施设备管理导入模板.xls
* 2:/templates/supplier/供应商管理导入模板.xls
* docTemplatePath = this.getClass().getResource("/").getPath()+/templates/supplier/供应商管理导入模板.xls";
* @param docWriteStartRowIndex//从模板第几行开始写入
* @return
* @throws FileNotFoundException
* @throws IOException
*/
public static HSSFWorkbook getHSSFWorkbook(Object object,String[] fields,String docTemplatePath,Integer docWriteStartRowIndex) throws FileNotFoundException,IOException {
docTemplatePath = docTemplatePath.replaceAll("\\\\", "/");
String projectPath = ImpAndExpExcel.class.getResource("/").getPath().replaceAll("\\\\", "/");
if(!docTemplatePath.contains(projectPath)){
docTemplatePath = projectPath+"/"+docTemplatePath;
}
FileInputStream inputStream = new FileInputStream(new File(docTemplatePath));
HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(inputStream));
HSSFSheet sheet = workbook.getSheetAt(0); int startRowIndex = (null == docWriteStartRowIndex?2:docWriteStartRowIndex); JSONArray jsonArr = (JSONArray) JSONArray.toJSON(object);
for (int i = 0; i < jsonArr.size(); i++,startRowIndex++) {
JSONObject jsonObj = jsonArr.getJSONObject(i);
for (int colIndex = 0; colIndex < fields.length; colIndex++) {
HSSFCell tempCell = getHssfCell(sheet, startRowIndex, colIndex, true); tempCell.setCellValue(jsonObj.getString(fields[colIndex]));
}
} return workbook;
}
/**
* 此方法用于下载指定文件。
* @param response 用于防止下载乱码,设置输出流的相关信息
* @param filePath 如 1:/D:/saw_workspace/property/property-manage-ui/target/classes//templates/supplier/设施设备管理导入模板.xls
* 2:/templates/supplier/供应商管理导入模板.xls
* filePath = this.getClass().getResource("/").getPath()+/templates/supplier/供应商管理导入模板.xls";
* @return true 下载成功, false 下载失败
*/
public static void download(String filePath){
ServletOutputStream out = null;
FileInputStream inputStream = null;
filePath = filePath.replaceAll("\\\\", "/");
String projectPath = ImpAndExpExcel.class.getResource("/").getPath().replaceAll("\\\\", "/");
if(!filePath.contains(projectPath)){
filePath = projectPath+"/"+filePath;
}
String fileName = filePath.substring(filePath.lastIndexOf("/")+1, filePath.length());
try{
inputStream = new FileInputStream(new File(filePath));
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/octet-stream; charset=UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=\""+new String(fileName.getBytes("GB2312"),"ISO8859-1")+"\";");// out = response.getOutputStream(); int b = 0;
byte[] buffer = new byte[512];
while ((b=inputStream.read(buffer)) != -1){
out.write(buffer,0,b);
}
out.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(inputStream != null){
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
} try {
if(out != null){
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} // 获取xlsx单元格,不存在是否创建
public static XSSFCell getXssfCell(XSSFSheet sheet, int rowIndex, int colIndex,
boolean isCreate) {
if (isCreate) {
XSSFRow row = sheet.getRow(rowIndex);
if (row == null) {
row = sheet.createRow(rowIndex);
row.setHeightInPoints(24);// 设置行的高度(单元格的高度)
}
XSSFCell cell = row.getCell(colIndex);
if (cell == null) {
cell = row.createCell(colIndex);
}
return cell;
} else {
return getXssfCell(sheet, rowIndex, colIndex);
}
} // 获取xlsx单元格
public static XSSFCell getXssfCell(XSSFSheet sheet, int rowIndex, int colIndex) {
XSSFRow row = sheet.getRow(rowIndex);
if (row != null) {
XSSFCell cell = row.getCell(colIndex);
if (cell != null) {
return cell;
}
}
return null;
} // 获取xlsx单元格Cell里面的值
// 因为cell单元格有格式,所以针对不同的格式取值
public static String getXssfCellValue(XSSFCell cell) {
String cellValue = "";
if(null==cell) {
return cellValue;
}
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING:// 字符串类型
cellValue = cell.getStringCellValue();
if (cellValue.trim().equals("") || cellValue.trim().length() <= 0)
cellValue = "";
break;
case XSSFCell.CELL_TYPE_NUMERIC: // 数值类型
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date d = cell.getDateCellValue();
if (d != null) {
cellValue = DateTimeUtils.getDate(d);
} else {
cellValue = "";
}
} else {
cellValue = cell.getNumericCellValue() + "";
if(cellValue.contains(".")){
cellValue = cellValue.substring(0, cellValue.indexOf("."));
}
}
break;
case HSSFCell.CELL_TYPE_FORMULA: // 公式
try{
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cellValue = String.valueOf(cell.getNumericCellValue());
}catch (Exception e) {
try{
cellValue = String.valueOf(cell.getStringCellValue());
}catch(Exception e2){
cellValue ="";
}
}
break;
case HSSFCell.CELL_TYPE_BLANK:
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_ERROR:
break;
default:
break;
}
if(cellValue!=null) {
cellValue = cellValue.trim();
}
return cellValue;
} // 获取xls单元格,不存在是否创建
public static HSSFCell getHssfCell(HSSFSheet sheet, int rowIndex, int colIndex,
boolean isCreate) {
if (isCreate) {
HSSFRow row = sheet.getRow(rowIndex);
if (row == null) {
row = sheet.createRow(rowIndex);
row.setHeightInPoints(24);// 设置行的高度(单元格的高度)
}
HSSFCell cell = row.getCell(colIndex);
if (cell == null) {
cell = row.createCell(colIndex);
}
return cell;
} else {
return getHssfCell(sheet, rowIndex, colIndex);
}
} // 获取xls单元格
public static HSSFCell getHssfCell(HSSFSheet sheet, int rowIndex, int colIndex) {
HSSFRow row = sheet.getRow(rowIndex);
if (row != null) {
HSSFCell cell = row.getCell(colIndex);
if (cell != null) {
return cell;
}
}
return null;
} // 获取xls单元格Cell里面的值
// 因为cell单元格有格式,所以针对不同的格式取值
public static String getHssfCellStringValue(HSSFCell cell) {
String cellValue = "";
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:// 字符串类型
cellValue = cell.getStringCellValue();
if (cellValue.trim().equals("") || cellValue.trim().length() <= 0)
cellValue = " ";
break;
case HSSFCell.CELL_TYPE_NUMERIC: // 数值类型
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date d = cell.getDateCellValue();
if (d != null) {
cellValue = DateTimeUtils.getDate(d);
} else {
cellValue = "";
}
} else {
cellValue = cell.getNumericCellValue() + "";
if(cellValue.contains(".")){
cellValue = cellValue.substring(0, cellValue.indexOf("."));
}
}
break;
case HSSFCell.CELL_TYPE_FORMULA: // 公式
try{
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cellValue = String.valueOf(cell.getNumericCellValue());
}catch (Exception e) {
try{
cellValue = String.valueOf(cell.getStringCellValue());
}catch(Exception e2){
cellValue ="";
}
}
break;
case HSSFCell.CELL_TYPE_BLANK:
cellValue = " ";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
break;
case HSSFCell.CELL_TYPE_ERROR:
break;
default:
break;
}
return cellValue;
} public static boolean isRequired(String checkFiled, String[] requireds) {
if(StringUtils.isEmpty(checkFiled) || ArrayUtils.isEmpty(requireds)) {
return false;
}
for(String required : requireds) {
if(required.equals(checkFiled)) {
return true;
}
}
return false;
}
}
模板样子

java Excel导入导出工具类的更多相关文章
- Java基础学习总结(49)——Excel导入导出工具类
在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- java中excel导入\导出工具类
1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...
- 【原创】POI操作Excel导入导出工具类ExcelUtil
关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.Th ...
- java word导入导出工具类
package com.shareworx.yjwy.utils; import java.io.InputStream; import java.util.HashMap; import java. ...
- java简易excel导入导出工具(封装POI)
Octopus 如何导入excel 如何导出excel github项目地址 Octopus Octopus 是一个简单的java excel导入导出工具. 如何导入excel 下面是一个excel文 ...
- Octopus——excel导入导出工具
Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...
- Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)
Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java 版权声明:本 ...
- Excel导入导出帮助类
/// <summary> /// Excel导入导出帮助类 /// 记得引入 NPOI /// 下载地址 http://npoi.codeplex.com/rele ...
随机推荐
- Spark Core源代码分析: RDD基础
RDD RDD初始參数:上下文和一组依赖 abstract class RDD[T: ClassTag]( @transient private var sc: SparkContext, @tran ...
- 创建Spring Boot项目的几种方式总结
一.我们可以使用Spring Initializr来创建SpringBoot项目. Spring Initializr从本质上来说就是一个Web应用程序,它能为你生成Spring Boot项目结构.虽 ...
- openfile
linux修改open files数 概要 linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不 ...
- Struts2 Action/动作
动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架.每个URL将被映射到一个特定的动作,它提供了来自用户的请求提供服务所需的处理逻辑. 但动作也提供其他两个重要的能 ...
- python 设计模式之单例模式
单例模式就是防止每个请求到来,都需要在内存里创建一个实例,再通过该实例执行指定的方法. 如果并发量大的话,内存里就会存在非常多功能上一模一样的对象.存在这些对象肯定会消耗内存,对于这些功能相同的对象可 ...
- 26计算限制的异步操作02-CLR
由CLR via C#(第三版) ,摘抄记录... 6 Parallel的静态For,ForEach和Invoke方法 在一些常见的编程情形中,使用任务也许会提升性能.为了简化编程,静态类System ...
- 转载: vim使用技巧
两篇很牛的vim使用技巧 来源: ChinaUnix博客 日期: 2009.07.06 10:18 (共有条评论) 我要评论 读本文之前请注意:1. 本文的目标是提供一些vim的使用技巧,利用 ...
- windows下用py2exe打包脚本为可双击运行程序
文件夹结构: ├── readme.txt ├── settings.py #程序参数 ├── settings.pyc ├── setup.py #安装文件 ├── spider.ico ...
- Python gevent学习笔记
gevent是Python的一个用于网络IO的函数库,其中应用到了 coroutine(协同程序) 的思想.首先来了解下目前网络框架的几种基本的网络I/O模型: 阻塞式单线程:这是最基本的I/O模型, ...
- go语言调用cmd
package main import ( "fmt" "os/exec" ) func main() { //删除C:\Users\Administrator ...