org.apache.poi3.1.7 Excle并发批量导入导出

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;
    }
}

原文地址:https://www.cnblogs.com/xiaoyongsz/p/10216743.html

时间: 2024-10-10 15:42:06

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

使用CSVDE命令批量导入/导出AD用户

使用CSVDE命令批量导入/导出AD用户 CSVDE命令行工具可以将带有用户信息的CSV文件,批量导入/导出AD中. 导入的基本语法命令是这样的: csvde -i -f c:\filename.csv -k 输入以下命令查看具体参数: csvde /? 首先在Excel中设置好用户信息,然后将文件保存为csv格式. 在cmd中执行导入命令. 可以看到,导入成功.在AD中查看: 可以看到新增加的两个用户,但它们与其余三个不同,有个向下的箭头.这是因为CSVDE命令是无法导入密码的,所以导入的用户

PowerShell 批量导入/导出Active Directory

PowerShell 批量导入/导出Active Directory 最近因为公司要求,需要导入20个供应商.20个客户到AD域中,刚开始手动加入了2个供应商,2个客户.但是感觉费时费力.如果能够找到一个命令,批量导入AD该多好呀. 因为之前有师兄在AD方面留下的有文档,发现AD域用户导出的命令是这样的: csvde -f E:\20131015.csv -r "(objectClass=user)" -d "OU=XXX,DC=XXX,DC=com" -u 这里对

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

1.介绍 java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iReport,poi主要作为一些数据批量导入数据库,iReport做报表导出.另外还有jxl类似poi的方式,不过貌似很久没跟新了,2007之后的office好像也不支持,这里就不说了. 2.POI使用详解 2.1 什么是Apache POI? Apache POI是Apache软件基金会的开放源码函式库,

AD帐号批量导入导出

一.批量导入帐户 步骤及原理: 1.先用Excel表格做一个简单模版,将其保存为.csv格式! 2.再用For命令结合dsadd 来完成批量创建用户! 使用到的命令:(注:以下命令里参数为笔者做测试,别忘记修改!) for /f  "tokens=1,2,3,4,5 delims=," %a in (D:\USER1.csv) do dsadd user "cn=%c,ou=IT,dc=test,dc=com"  -samid %d -upn %d -ln %a -

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

在日常使用报表过程中,会有这样一种情况,你将Excel表分发给各个员工,员工填完后,统一整理成多个Excel,你需要将这些数据,用报表的填报功能,提交录入到数据库中,这样一来可避免到服务器机房录数据的繁琐步骤,但是无论是批量导入和还是导出Excel,这对诸多报表软件或称集成报表功能的系统来说都是不容易的. 解决Excel导入的性能问题,可以利用FineReport开发的op=excel_submit功能,来实现不预览报表即可对填报表导入Excel. 根据报表工程的使用方式不同,批量导入Excel

postgresql备份恢复数据库和批量导入导出数据到文件方法

备份数据库:pg_dump -h localhost -U root demo02 > /home/arno/dumps/demo02.bak 恢复数据库:psql -h localhost -U root -d demo <  demo.bak 备份表:pg_dump -h localhost -U root demo02 -t books > /home/arno/dumps/books.bak 恢复表:psql -h localhost -U root -d demo -t boo

使用cardme读写VCard文件,实现批量导入导出电话簿

首先下载jar包cardme. http://sourceforge.net/projects/cardme/?source=navbar cardme是基于java语言的操作vCard(后缀vcf)文件的开源项目. 在项目中有一个类net.sourceforge.cardme.engine.TestParser.是官方给的example. 先来梳理几个基本概念 VCardEngine:主要用于从字符.文件中格式化或读取VCard数据,并转换为VCard对象. VCardWriter:主要用户把

C#批量导入Excel或WPS实现方法

批量导入导出Excel,WPS,TXT,可按照系统是否安装OFFICE.WPS情况选择,导出是自动选择. 上效果图 1 /// <summary> 2 /// //获得当前你选择的Excel Sheet的所有名字 3 /// </summary> 4 /// <param name="filePath">文件路径</param> 5 /// <param name="ExcelType">1 Microso

并发批量管理500台以上服务器脚本分享(shell版)

也许很多人认为shell不能并发任务,其实可通过其它一些方式来实现.下面的脚本是我批量快速管理500+服务器脚本,阅读该脚本前建议先看<自动执行远程主机命令expect脚本>.<自动远程拷贝expect脚本>和<getopt:命令行选项.参数处理> 用法: Usage: ./multi_main.sh [-h|--help] [-v|-V|--version] [-l|--iplist ... ] [-c|--config ... ] [-t|--sshtimeout