org.apache.poi3.1.7 升级,需要修改设置方式:

1、org.apache.poi3.1.4 的设置单元格:

XSSFCellStyle cellStyle = wb.createCellStyle();   
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 居中  
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);//垂直

org.apache.poi3.1.7的设置单元格,格式为:

XSSFCellStyle cellStyle = wb.createCellStyle();   
cellStylestyle.setAlignment(HorizontalAlignment.CENTER);// 居中  
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);;//垂直

2、同时在设置边框时候,也有相应的同样问题,HSSFCellStyle 中同样报错没有其中的值

cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框    
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框    
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框    
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

需要升级一下方式:

cellStyle.setBorderBottom(BorderStyle.THIN); //下边框    
cellStyle.setBorderLeft(BorderStyle.THIN);//左边框    
cellStyle.setBorderTop(BorderStyle.THIN);//上边框    
cellStyle.setBorderRight(BorderStyle.THIN);//右边框

3、代码分享:EXCLE导入导出,二话不说直接上代码:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ppdai.wechat.contract.model.CoverBuildingInfo;
import com.ppdai.wechat.contract.request.BatchInsertBuildingRequest;
import com.ppdai.wechat.spring.entity.OutputResult;
import com.ppdai.wechat.spring.service.CoverBuildingMService;
import com.ppdai.wechat.spring.util.CommonUtil;
import com.ppdai.wechat.spring.util.StringUtil;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.*; /**
* Description:Excel解析
* Created by xiaoyongyong on 2017/11/15.
* Version: 1.0
*/
@Service
public class AwardExcelReader { @Autowired
private CoverBuildingMService coverBuildingMService;
private Logger logger = LoggerFactory.getLogger(AwardExcelReader.class);
private static CountDownLatch latch = new CountDownLatch(10);
private static ExecutorService executorService = Executors.newFixedThreadPool(5);
private int pageIndex = 0; /**
* Excel的导出数据和格式设定
* Excel 2003及以下的版本。一张表最大支持65536行数据,256列。也就是说excel2003完全不可能满足百万数据导出的需求。
* Excel 2007-2010版本。一张表最大支持1048576行,16384列;
*
* @param data title对应的属性
* @param titles 导出Excle的列头
* @param list 查询的list集合
* @param response HttpServletResponse
* @param fileName 文件名
* @throws Exception Exception
*/
public static <T> void excelData(String[] data, String[] titles, List<T> list, HttpServletResponse response, String fileName) throws Exception {
// 生成提示信息,
response.setContentType("application/vnd.ms-excel");
try (OutputStream os = response.getOutputStream()) {
// 进行转码,使其支持中文件名
String codeFileName = java.net.URLEncoder.encode(fileName, "UTF-8");
response.setHeader("content-disposition", "attachment;filename=" + codeFileName + ".xlsx");
// 生成工作簿对象
SXSSFWorkbook workbook = new SXSSFWorkbook();
//产生工作表对象
SXSSFSheet sheet = workbook.createSheet();
//循环表头
for (int i = 0; i < titles.length; i++) {
//设置表列宽
sheet.setColumnWidth((short) i, 25 * 256);
}
//设置统一单元格的高度
sheet.setDefaultRowHeight((short) 300);
//样式1
CellStyle style = workbook.createCellStyle(); // 样式对象
style.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直
style.setAlignment(HorizontalAlignment.CENTER); // 水平
style.setWrapText(true); //设置是否能够换行,能够换行为true
style.setBorderBottom(BorderStyle.THIN); //设置下划线,参数是黑线的宽度
style.setBorderLeft(BorderStyle.THIN); //设置左边框
style.setBorderRight(BorderStyle.THIN); //设置有边框
style.setBorderTop(BorderStyle.THIN); //设置上边框
//设置标题字体格式
Font font = workbook.createFont();
//设置字体样式
font.setFontHeightInPoints((short) 20); //设置字体大小
font.setFontName("Courier New"); //设置字体,例如:宋体 List<Field> fieldList = new ArrayList<>();
//支持子类父类两级
fieldList.addAll(Arrays.asList(list.get(0).getClass().getDeclaredFields()));
fieldList.addAll(Arrays.asList(list.get(0).getClass().getSuperclass().getDeclaredFields()));
Map<String, Field> fieldMap = new HashMap<>();
for (Field field : fieldList) {
if ("serialVersionUID".equals(field.getName()))
continue;
field.setAccessible(true);
fieldMap.put(field.getName(), field);
} //创建第一行
SXSSFRow row = sheet.createRow(0);
//为第一行的所有列赋值
for (int i = 0; i < titles.length; i++) {
SXSSFCell cell = row.createCell(i);
cell.setCellValue(titles[i]);
}
//循环list集合,把数据写到Excel
if (!list.isEmpty()) {
int i = 1;
for (T tt : list) {
// 创建除第一行的一下data行
SXSSFRow sxssfRow = sheet.createRow(i++);
String val = "";
// 创建一行的所有列并为其赋值
for (int v = 0; v < data.length; v++) {
Field field = fieldMap.get(data[v]);
if (!field.isAnnotationPresent(JsonIgnore.class)) {
Object fieldValue = new PropertyDescriptor(field.getName(), tt.getClass()).getReadMethod().invoke(tt);
if (fieldValue == null) {
val = "";
} else {
val = fieldValue.toString();
}
}
sxssfRow.createCell(v).setCellValue(val);
}
}
}
workbook.write(os);
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 批量读取Excle
* @param uploadFile 上传的Excle文件
* @param pageSize 多线程解析excle的行数
* @throws Exception
*/
public void importExcel(MultipartFile uploadFile, Integer pageSize) throws Exception {
//解析excel 2007 版本文件
String awardName = uploadFile.getOriginalFilename().substring(0, uploadFile.getOriginalFilename().indexOf("."));
XSSFWorkbook workbook = new XSSFWorkbook(uploadFile.getInputStream());//
XSSFSheet sheet = workbook.getSheetAt(0);
int totalRows = sheet.getLastRowNum() + 1;//一共有多少行
if (totalRows == 0) {
throw new Exception("请填写数据!");
}
try {
List<Future> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
futures.add(executorService.submit(new AwardExcelReader.ReaderImport(pageSize, totalRows, sheet, awardName)));
}
for (Future future : futures) {
if (future.get() != null) {
latch.countDown();
}
}
latch.await();//命令发送后指挥官处于等待状态,一旦cdAnswer为0时停止等待继续往下执行
} catch (Exception e) {
pageIndex = 0;
logger.error("importExcel处理异常,异常信息", e);
} finally {
pageIndex = 0;
System.gc();
}
} private class ReaderImport implements Callable<Object> {
private Integer pageSize;
private Integer totalRows;
private XSSFSheet sheet;
private String awardName; ReaderImport(Integer pageSize, Integer totalRows, XSSFSheet sheet, String awardName) {
this.pageSize = pageSize;
this.totalRows = totalRows;
this.sheet = sheet;
this.awardName = awardName;
} @Override
public Object call() throws Exception {
start(pageSize, totalRows, sheet, awardName);
return 1;
}
} private void start(Integer pageSize, Integer totalRows, XSSFSheet sheet, String awardName) throws Exception {
while (true) {
//1、批量读取Excel数据,分批次查询,一次查询1000条
BatchInsertBuildingRequest request = new BatchInsertBuildingRequest();
synchronized (this) {
pageIndex++;
List<CoverBuildingInfo> coverBuildingInfos = new ArrayList<>();
for (int rowIndex = pageIndex * pageSize - pageSize == 0 ? 0 : pageIndex * pageSize - pageSize + 1;
rowIndex <= pageIndex * pageSize; rowIndex++) {
XSSFRow row = sheet.getRow(rowIndex);
if (row == null) {
continue;
}
if (StringUtil.isNullOrEmpty(CommonUtil.getCellValue(row.getCell(0)))) {
continue;
}
CoverBuildingInfo coverBuildingInfo = new CoverBuildingInfo();
coverBuildingInfo.setAwardName(awardName);
coverBuildingInfo.setAward(CommonUtil.getCellValue(row.getCell(0)));
coverBuildingInfo.setRemark(String.valueOf(pageIndex));
coverBuildingInfos.add(coverBuildingInfo);
}
request.setCoverBuildingInfos(coverBuildingInfos);
if (pageIndex > CommonUtil.getTotalPage(pageSize, totalRows)) {
break;
}
}
OutputResult baseResponse = coverBuildingMService.batchInsertBuilding(request);
if (baseResponse.getResult() != 0) {
logger.error("批量写入数据异常,异常信息", baseResponse.getResultMessage());
} }
} }
public class CommonUtil {
public static Integer getTotalPage(Integer pageSize, Integer totalCount) {
Integer totalPage;
if (totalCount % pageSize == 0) {
totalPage = totalCount / pageSize;
} else {
totalPage = totalCount / pageSize + 1;
}
return totalPage;
} /**
* 获取Cell内容
* @param cell cell
* @return String
*/
public static String getCellValue(Cell cell) {
String cellValue = "";
if (cell != null) {
switch (cell.getCellTypeEnum()) {
case STRING:
cellValue = cell.getStringCellValue();
break;
case NUMERIC:
cellValue = cell.getNumericCellValue() + "";
break;
case BLANK:
break;
default:
break;
}
}
return cellValue;
}
}

下面是实用类:

@RequestMapping("/export")
public void export(HttpServletResponse response, @RequestParam(required = false) Integer activityId) throws Exception {
long s1 = System.currentTimeMillis();
String[] titles = new String[]{"奖励名称", "奖励", "是否赠送", "修改时间"};
String[] data = new String[]{"awardName", "award", "useful", "updatetime"};
List<CoverBuildingBO> list = new ArrayList<>();
long start = System.currentTimeMillis();
reader.excelData(data, titles, list, response, fileName);
long spend = System.currentTimeMillis() - start;
long s2 = System.currentTimeMillis() - s1;
System.out.println("文件总数:" + list.size() + "条,excel生成耗时:" + spend + "毫秒" + ",总耗时:" + s2 + "毫秒.");
}

org.apache.poi3.1.7 Excle并发批量导入导出的更多相关文章

  1. PowerShell 批量导入/导出Active Directory

    PowerShell 批量导入/导出Active Directory         近期由于公司要求,须要导入20个供应商.20个客户到AD域中,刚開始手动添�了2个供应商,2个客户.可是感觉费时费 ...

  2. SQL Server中bcp命令的用法以及数据批量导入导出

    原文:SQL Server中bcp命令的用法以及数据批量导入导出 1.bcp命令参数解析 bcp命令有许多参数,下面给出bcp命令参数的简要解析 用法: bcp {dbtable | query} { ...

  3. 用poi框架进行批量导入导出实例

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能.我们这里使用poi对数据库中的数据进行批量导出,以及 ...

  4. java实现文件批量导入导出实例(兼容xls,xlsx)

    1.介绍 java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iRepo ...

  5. 报表开发之批量导入导出excel

    在日常使用报表过程中,会有这样一种情况,你将Excel表分发给各个员工,员工填完后,统一整理成多个Excel,你需要将这些数据,用报表的填报功能,提交录入到数据库中,这样一来可避免到服务器机房录数据的 ...

  6. asp.net mvc4 easyui datagrid 增删改查分页 导出 先上传后导入 NPOI批量导入 导出EXCEL

    效果图 数据库代码 create database CardManage use CardManage create table CardManage ( ID ,) primary key, use ...

  7. 小工具:批量导入导出主机上的docker镜像

    工作需要,将主机上的部分镜像导出为tar文件,放便在其他主机上使用 用python实现了一个批量打包脚本: import re import os import subprocess if __nam ...

  8. 批量导入导出站点权限site permissions

    批量导入站点权限   cls $Web = Get-SPWeb "http://16.178.115.14:91/" Get-Content c:\export\account.t ...

  9. Excel批量导入(导出同理)

    在做JavaWeb中添加数据使我们在所难免会遇到的,在大数据的环境下批量添加和批量删除是必须的,而批量删除只需要获取到我们需要删除的ID就可以了,在批量添加中我们就会遇到问题,问题是得到批量的数据,这 ...

随机推荐

  1. django网站安全学习记录

    现在比较流行的网站攻击方式有sql注入,xss跨站脚本攻击,csrf跨站请求伪造,一句话木马等等 django非常强大,对这些攻击都做了防范 sql注入,通过在sql语句中插入非法的sql语句来实现爆 ...

  2. Java高级特性—反射和动态代理

    1).反射 通过反射的方式可以获取class对象中的属性.方法.构造函数等,一下是实例: 2).动态代理 使用场景: 在之前的代码调用阶段,我们用action调用service的方法实现业务即可. 由 ...

  3. java读取properties文件,并在配置文件中设置默认浏览器驱动

    java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值"的格式,在properti ...

  4. [Angular] Dynamic component rendering by using *ngComponentOutlet

    Let's say you want to rending some component based on condition, for example a Tabs component. Insid ...

  5. openlayers对接百度地图新方法

    上次给大家提供的openlayers对接百度地图有些问题,是因为没有进行分辨率设置,也没有进行相应的平面坐标转换,获取getURL的方法还是没有变化的 getURL: function (bounds ...

  6. kettle入门(七) 之kettle增量方案(一)全量比对取增量-依据唯一标示

    引: ods有个project表来自于上游系统,数据量不大 十几万,下游系统须要此数据,而且须要每天提供截止当天的增量数据 要求每条数据给出数据变化时间及标示,即数据若是插入 有插入时间和插入标示 若 ...

  7. uva 10034 Freckles (kruskal||prim)

    题目上仅仅给的坐标,没有给出来边的长度,不管是prim算法还是kruskal算法我们都须要知道边的长度来操作. 这道题是浮点数,也没啥大的差别,处理一下就能够了. 有关这两个算法的介绍前面我已经写过了 ...

  8. JavaScript Array splice函数

    // 原来的数组 var array = ["one", "two", "four"]; // splice(position, numbe ...

  9. ios 使用gcd 显示倒计时

    __block ;//倒计时时间 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ...

  10. 15个私有云上的 DevOps 开源工具

    原文:http://www.sohu.com/a/136276885_262549 在可维护性,可靠性,效率和安全性方面,DevOps 为私有云在改进操作流程方面发挥着重要的作用.私有云是一个由许多硬 ...