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 ...
随机推荐
- Java并发编程(十一)实例封闭
本节主题:如果一个类是线程不安全的,但是又要在多线程程序中安全地使用,你该怎么办? 大体有两种思路: 第一种:确保该对象是能由单个线程访问,也就是这个对象是被封闭在线程中的: 第二种:通过锁来对该对象 ...
- quantz入门和使用流程(转载)
1.下载地址:http://quartz-scheduler.org/downloads/catalog http://quartz-scheduler.org/downloads/destinati ...
- Eclipse中关于JRE System Library、Web App Libraries的疑惑
当我们在Eclipse中建立java的web工程时,会产生JRE System Library和Referenced Libraries,Web App Libraries不生成,下面会 简要说明一下 ...
- 【Python + ATX】之uiautomator2 PageObject模式自动化框架学习
参考文章: 感谢:cynic (linpengcheng) <ATX 基于 ATX-Server 的 UI 自动化测试框架> <ATX-uiautomator2 实现 webview ...
- Android开发教程:shape和selector的结合使用(转载)
shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和 ...
- lumen 事件
今天需要实现日志功能,所有使用了一下lumen的event(事件)和listener(监听) Lumen事件:https://lumen.laravel-china.org/docs/5.3/even ...
- chm文件无法阅读
当我们费劲千辛万苦从网上下载好chm文件资料后,打开后发现竟然是这个样子的: 其中主要原因是CHM文件被阻止显示了,CHM文件在NTFS格式的硬盘里的时候就会被阻止显示.我们返回我的电脑,点中我们存放 ...
- 带参数的main函数
带参数的main函数 int main(int argc,char **argv) 或int main(int argc,char *argv[]) /*解析 依据<C程序设计语言(第二版. ...
- poj3481(splay tree 入门题)
平衡树都能做. // // main.cpp // splay // // Created by 陈加寿 on 16/3/25. // Copyright © 2016年 chenhuan001. A ...
- 【BZOJ2803】[Poi2012]Prefixuffix 结论题
[BZOJ2803][Poi2012]Prefixuffix Description 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串 ...