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. JavaWeb项目实现文件下载

    File file = new File(path);// path是根据日志路径和文件名拼接出来的 String filename = file.getName();// 获取日志文件名称 Inpu ...

  2. 为什么重写equals方法时,要求必须重写hashCode方法?

    1 equals方法 Object类中默认的实现方式是  :   return this == obj  .那就是说,只有this 和 obj引用同一个对象,才会返回true. 而我们往往需要用equ ...

  3. Manacher回文串算法学习记录

    FROM:  http://hi.baidu.com/chenwenwen0210/item/482c84396476f0e02f8ec230 #include<stdio.h> #inc ...

  4. nginx资源争夺问题

    nginx资源争夺问题 多个配置之间存在资源争夺的情况,需要进行整理: 学习了:https://blog.csdn.net/veryisjava/article/details/72917894 ng ...

  5. hdu 5012 bfs --- 慎用STL 比方MAP判重

    http://acm.hdu.edu.cn/showproblem.php?pid=5012 发现一个问题 假设Sting s = '1'+'2'+'3'; s!="123"!!! ...

  6. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_指针

    定义pt为指向INT类型的指针,在程序中取得var_int1的地址(INT类型),然后将地址对应的数据还原给var_int2(pt^的写法)     更多教学视频和资料下载,欢迎关注以下信息: 我的优 ...

  7. python 赋值 深浅拷贝

    深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 impor ...

  8. mysql 修复

    /home/wkubuntu/mysql/data/iZ25sgya7raZbak.pid  pid 文件notfond 错误解决 一.截图 snipingtool skip-locking 修改成 ...

  9. 已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”

    题目:已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”. 代码: <!DOCTYPE html> &l ...

  10. 3D版翻页公告效果

    代码地址如下:http://www.demodashi.com/demo/12830.html 前言: 在逛小程序蘑菇街的时候,看到一个2D版滚动的翻页公告效果.其实看到这个效果的时候,一点都不觉得稀 ...