文档章节

poi大数据导入导出 不分sheet

就叫罗小黑吧
 就叫罗小黑吧
发布于 2017/08/08 13:51
字数 1613
阅读 12
收藏 0
点赞 0
评论 0

//导入execl

package syncDataSys;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import syncDataSys.dao.DaIllegalQueryDao;
import syncDataSys.dao.DaUserDao;
import syncDataSys.dao.impl.DaIllegalQueryDaoImpl;
import syncDataSys.dao.impl.DaUserDaoImpl;
import syncDataSys.entity.DaIllegalQuery;
import syncDataSys.entity.DaUser;


public class ExcelHelper {

    
    public void sysnMouthData (){
        System.out.println("开始导出数据");
        DaUserDao userDao=new DaUserDaoImpl();
        DaIllegalQueryDao    daIllegalQueryDao=new DaIllegalQueryDaoImpl();
        Calendar cal = Calendar.getInstance();
        int month = cal.get(Calendar.MONTH);
        int year = cal.get(Calendar.YEAR);
        // System.out.println("Current Date: " + cal.getTime()); // 当前时间
        // System.out.println("Month: " + month);// 上一月份
        // System.out.println("Year: " + year);// 当前年份
        String date = null;// 上一月份
        if (month < 10) {
            date = "" + year + 0 + month + "%";
        } else {
            date = "" + year + month + "%";

        }
        // SimpleDateFormat s = new SimpleDateFormat("yyyymmdd-hhmmss");
        List<DaUser> l = userDao.findUserbyTime(date);  

        Map map = new HashMap();
        map.put("date", date);
        int total = daIllegalQueryDao.countall(date);
        int page = 1;

        int minnum = 0;
        int maxnum = 1;
        int pagesize = 100000;
        if (total > pagesize) {
            page = total / pagesize + 1;
        }

        // 设置单元格格式居中
        cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(CellStyle.ALIGN_CENTER);

        // 创建一个工作表
        // 创建一个Excel文件
        // Workbook workbook1 = new XSSFWorkbook();

        Sheet sheet1 = workbook.createSheet("sheet1");

        // 添加表头行
        Row hssfRow1 = sheet1.createRow(0);
        // 设置单元格格式居中
        cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(CellStyle.ALIGN_CENTER);

        // 添加表头内容
        Cell headCell1 = hssfRow1.createCell(0);
        headCell1.setCellValue("手机号");
        headCell1.setCellStyle(cellStyle);

        headCell1 = hssfRow1.createCell(1);
        headCell1.setCellValue("操作时间");
        headCell1.setCellStyle(cellStyle);

        headCell1 = hssfRow1.createCell(2);
        headCell1.setCellValue("变更记录");
        headCell1.setCellStyle(cellStyle);

        headCell1 = hssfRow1.createCell(3);
        headCell1.setCellValue("操作平台");
        headCell1.setCellStyle(cellStyle);

      
            

            daiqs = daIllegalQueryDao.findByTime( date, maxnum,  minnum);

            // 将内存中的数据刷到硬盘中去
            sheet1.getRow(minnum);

            // 添加数据内容
            for (int j = 0; j < daiqs.size(); j++) {

                hssfRow1 = sheet1.createRow(j + 1 + (i - 1) * pagesize);
                DaIllegalQuery daiq = daiqs.get(j);
                //System.out.println(j + 1 + (i - 1) * pagesize);

                // 创建单元格,并设置值
                Cell cell = hssfRow1.createCell(0);
                cell.setCellValue(daiq.getUserPhone()); // 手机号
                cell.setCellStyle(cellStyle);

                cell = hssfRow1.createCell(1);
                cell.setCellValue(daiq.getQueryDate()); // 操作时间
                cell.setCellStyle(cellStyle);

                cell = hssfRow1.createCell(2);   
                    cell.setCellValue(j);              
                cell.setCellStyle(cellStyle);            
                cell = hssfRow1.createCell(3);            
                    cell.setCellValue("WEB_WAP");       
                cell.setCellStyle(cellStyle);              
            if (i == page) {
                // 将内存中的数据刷到硬盘中去
                sheet1.getRow(total - minnum * page);
            }

        }
        // 保存Excel文件
        try {          
            OutputStream outputStream = new FileOutputStream("d:\\test" + year
                    + month + ".xlsx");
            workbook.write(outputStream);
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
 

//从execl中导出数据


import java.io.BufferedWriter;  
import java.io.InputStream;  
import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  
  
import org.apache.poi.openxml4j.opc.OPCPackage;  
import org.apache.poi.ss.usermodel.BuiltinFormats;  
import org.apache.poi.ss.usermodel.DataFormatter;  
import org.apache.poi.xssf.eventusermodel.XSSFReader;  
import org.apache.poi.xssf.model.SharedStringsTable;  
import org.apache.poi.xssf.model.StylesTable;  
import org.apache.poi.xssf.usermodel.XSSFCellStyle;  
import org.apache.poi.xssf.usermodel.XSSFRichTextString;  
import org.xml.sax.Attributes;  
import org.xml.sax.ContentHandler;  
import org.xml.sax.InputSource;  
import org.xml.sax.SAXException;  
import org.xml.sax.XMLReader;  
import org.xml.sax.helpers.DefaultHandler;  
import org.xml.sax.helpers.XMLReaderFactory;  
  
public class ExampleEventUserModelUtil {  
      
    private static StylesTable stylesTable;  
      
    /** 
     * 处理一个sheet 
     * @param filename 
     * @throws Exception 
     */  
    public void processOneSheet(String filename) throws Exception {  
          
        OPCPackage pkg = OPCPackage.open(filename);  
        XSSFReader r = new XSSFReader( pkg );  
        stylesTable = r.getStylesTable();   
        SharedStringsTable sst = r.getSharedStringsTable();  
  
        XMLReader parser = fetchSheetParser(sst);  
        Iterator<InputStream> sheets = r.getSheetsData();
        while (sheets.hasNext())
        {
            InputStream sheet = sheets.next();
            InputSource sheetSource = new InputSource(sheet);
            parser.parse(sheetSource);
            sheet.close();
        }
        
        
    }  
  
    /** 
     * 处理所有sheet 
     * @param filename 
     * @throws Exception 
     */  
    public void processAllSheets(String filename) throws Exception {  
          
        OPCPackage pkg = OPCPackage.open(filename);  
        XSSFReader r = new XSSFReader( pkg );  
        SharedStringsTable sst = r.getSharedStringsTable();  
          
        XMLReader parser = fetchSheetParser(sst);  
  
        Iterator<InputStream> sheets = r.getSheetsData();  
        while(sheets.hasNext()) {  
            System.out.println("Processing new sheet:\n");  
            InputStream sheet = sheets.next();  
            InputSource sheetSource = new InputSource(sheet);  
            parser.parse(sheetSource);  
            sheet.close();  
            System.out.println("");  
        }  
    }  
  
    /** 
     * 获取解析器 
     * @param sst 
     * @return 
     * @throws SAXException 
     */  
    public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException {  
        XMLReader parser =  
            XMLReaderFactory.createXMLReader(  
                    "org.apache.xerces.parsers.SAXParser"  
            );   
        ContentHandler handler = new SheetHandler(sst);  
        parser.setContentHandler(handler);  
        return parser;  
    }  
  
    /**  
     * 自定义解析处理器 
     * See org.xml.sax.helpers.DefaultHandler javadocs  
     */  
    private static class SheetHandler extends DefaultHandler {  
          
        private SharedStringsTable sst;  
        private String lastContents;  
        private boolean nextIsString;  
          
        private List<String> rowlist = new ArrayList<String>();   
        private int curRow = 0;   
        private int curCol = 0;  
          
        //定义前一个元素和当前元素的位置,用来计算其中空的单元格数量,如A6和A8等  
        private String preRef = null, ref = null;  
        //定义该文档一行最大的单元格数,用来补全一行最后可能缺失的单元格  
        private String maxRef = null;  
          
        private CellDataType nextDataType = CellDataType.SSTINDEX;   
        private final DataFormatter formatter = new DataFormatter();   
        private short formatIndex;   
        private String formatString;   
          
        //用一个enum表示单元格可能的数据类型  
        enum CellDataType{   
            BOOL, ERROR, FORMULA, INLINESTR, SSTINDEX, NUMBER, DATE, NULL   
        }  
          
        private SheetHandler(SharedStringsTable sst) {  
            this.sst = sst;  
        }  
          
        /** 
         * 解析一个element的开始时触发事件 
         */  
        public void startElement(String uri, String localName, String name,  
                Attributes attributes) throws SAXException {  
              
            // c => cell  
            if(name.equals("c")) {  
                //前一个单元格的位置  
                if(preRef == null){  
                    preRef = attributes.getValue("r");  
                }else{  
                    preRef = ref;  
                }  
                //当前单元格的位置  
                ref = attributes.getValue("r");  
                  
                this.setNextDataType(attributes);   
                  
                // Figure out if the value is an index in the SST  
                String cellType = attributes.getValue("t");  
                if(cellType != null && cellType.equals("s")) {  
                    nextIsString = true;  
                } else {  
                    nextIsString = false;  
                }  
                  
            }  
            // Clear contents cache  
            lastContents = "";  
        }  
          
        /** 
         * 根据element属性设置数据类型 
         * @param attributes 
         */  
        public void setNextDataType(Attributes attributes){   
  
            nextDataType = CellDataType.NUMBER;   
            formatIndex = -1;   
            formatString = null;   
            String cellType = attributes.getValue("t");   
            String cellStyleStr = attributes.getValue("s");   
            if ("b".equals(cellType)){   
                nextDataType = CellDataType.BOOL;  
            }else if ("e".equals(cellType)){   
                nextDataType = CellDataType.ERROR;   
            }else if ("inlineStr".equals(cellType)){   
                nextDataType = CellDataType.INLINESTR;   
            }else if ("s".equals(cellType)){   
                nextDataType = CellDataType.SSTINDEX;   
            }else if ("str".equals(cellType)){   
                nextDataType = CellDataType.FORMULA;   
            }  
            if (cellStyleStr != null){   
                int styleIndex = Integer.parseInt(cellStyleStr);   
                XSSFCellStyle style = stylesTable.getStyleAt(styleIndex);   
                formatIndex = style.getDataFormat();   
                formatString = style.getDataFormatString();   
                if ("m/d/yy" == formatString){   
                    nextDataType = CellDataType.DATE;   
                    //full format is "yyyy-MM-dd hh:mm:ss.SSS";  
                    formatString = "yyyy-MM-dd";  
                }   
                if (formatString == null){   
                    nextDataType = CellDataType.NULL;   
                    formatString = BuiltinFormats.getBuiltinFormat(formatIndex);   
                }   
            }   
        }  
          
        /** 
         * 解析一个element元素结束时触发事件 
         */  
        public void endElement(String uri, String localName, String name)  
                throws SAXException {  
            // Process the last contents as required.  
            // Do now, as characters() may be called more than once  
            if(nextIsString) {  
                int idx = Integer.parseInt(lastContents);  
                lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();  
                nextIsString = false;  
            }  
  
            // v => contents of a cell  
            // Output after we've seen the string contents  
            if ("v".equals(name)|| "t".equals(name)) {   
                String value = this.getDataValue(lastContents.trim(), "");   
                //补全单元格之间的空单元格  
                if(!ref.equals(preRef)){  
                    int len = countNullCell(ref, preRef);  
                    for(int i=0;i<len;i++){  
                        rowlist.add(curCol, "");  
                        curCol++;  
                    }  
                }  
                rowlist.add(curCol, value);  
                curCol++;   
            }else {   
                //如果标签名称为 row,这说明已到行尾,调用 optRows() 方法   
                if (name.equals("row")) {  
                    String value = "";  
                    //默认第一行为表头,以该行单元格数目为最大数目  
                    if(curRow == 0){  
                        maxRef = ref;  
                    }  
                    //补全一行尾部可能缺失的单元格  
                    if(maxRef != null){  
                        int len = countNullCell(maxRef, ref);  
                        for(int i=0;i<=len;i++){  
                            rowlist.add(curCol, "");  
                            curCol++;  
                        }  
                    }  
                    //拼接一行的数据  
                    for(int i=0;i<rowlist.size();i++){  
                        if(rowlist.get(i).contains(",")){  
                            value += "\""+rowlist.get(i)+"\",";  
                        }else{  
                            value += rowlist.get(i)+",";  
                        }  
                    }  
                    //加换行符  
                    value += "\n";  
//                    try {  
//                        writer.write(value);  
//                    } catch (IOException e) {  
//                        e.printStackTrace();  
//                    }  
                    curRow++;  
                    System.out.println(curRow + rowlist.toString()+"------");
                    //一行的末尾重置一些数据  
                    rowlist.clear();   
                    curCol = 0;   
                    preRef = null;  
                    ref = null;  
                }   
            }   
        }  
          
        /** 
         * 根据数据类型获取数据 
         * @param value 
         * @param thisStr 
         * @return 
         */  
        public String getDataValue(String value, String thisStr)   
  
        {   
            switch (nextDataType)   
            {   
                //这几个的顺序不能随便交换,交换了很可能会导致数据错误   
                case BOOL:   
                char first = value.charAt(0);   
                thisStr = first == '0' ? "FALSE" : "TRUE";   
                break;   
                case ERROR:   
                thisStr = "\"ERROR:" + value.toString() + '"';   
                break;   
                case FORMULA:   
                thisStr = '"' + value.toString() + '"';   
                break;   
                case INLINESTR:   
                XSSFRichTextString rtsi = new XSSFRichTextString(value.toString());   
                thisStr = rtsi.toString();   
                rtsi = null;   
                break;   
                case SSTINDEX:   
                String sstIndex = value.toString();   
                thisStr = value.toString();   
                break;   
                case NUMBER:   
                if (formatString != null){   
                    thisStr = formatter.formatRawCellContents(Double.parseDouble(value), formatIndex, formatString).trim();   
                }else{  
                    thisStr = value;   
                }   
                thisStr = thisStr.replace("_", "").trim();   
                break;   
                case DATE:   
                    try{  
                        thisStr = formatter.formatRawCellContents(Double.parseDouble(value), formatIndex, formatString);   
                    }catch(NumberFormatException ex){  
                        thisStr = value.toString();  
                    }  
                thisStr = thisStr.replace(" ", "");  
                break;   
                default:   
                thisStr = "";   
                break;   
            }   
            return thisStr;   
        }   
  
        /** 
         * 获取element的文本数据 
         */  
        public void characters(char[] ch, int start, int length)  
                throws SAXException {  
            lastContents += new String(ch, start, length);  
        }  
          
        /** 
         * 计算两个单元格之间的单元格数目(同一行) 
         * @param ref 
         * @param preRef 
         * @return 
         */  
        public int countNullCell(String ref, String preRef){  
            //excel2007最大行数是1048576,最大列数是16384,最后一列列名是XFD  
            String xfd = ref.replaceAll("\\d+", "");  
            String xfd_1 = preRef.replaceAll("\\d+", "");  
              
            xfd = fillChar(xfd, 3, '@', true);  
            xfd_1 = fillChar(xfd_1, 3, '@', true);  
              
            char[] letter = xfd.toCharArray();  
            char[] letter_1 = xfd_1.toCharArray();  
            int res = (letter[0]-letter_1[0])*26*26 + (letter[1]-letter_1[1])*26 + (letter[2]-letter_1[2]);  
            return res-1;  
        }  
          
        /** 
         * 字符串的填充 
         * @param str 
         * @param len 
         * @param let 
         * @param isPre 
         * @return 
         */  
        String fillChar(String str, int len, char let, boolean isPre){  
            int len_1 = str.length();  
            if(len_1 <len){  
                if(isPre){  
                    for(int i=0;i<(len-len_1);i++){  
                        str = let+str;  
                    }  
                }else{  
                    for(int i=0;i<(len-len_1);i++){  
                        str = str+let;  
                    }  
                }  
            }  
            return str;  
        }  
    }  
      
    static BufferedWriter writer = null;  
  
    public static void main(String[] args) throws Exception {  
        ExampleEventUserModelUtil example = new ExampleEventUserModelUtil();  
//        String str = "Book1";  
        String filename = "D:\\jczl20177.xlsx";  
        System.out.println("-- 程序开始 --");  
        long time_1 = System.currentTimeMillis();  
        try{  
//            writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\users40.xlsx")));  
            example.processOneSheet(filename);  
        }finally{  
//            writer.close();  
        }  
        long time_2 = System.currentTimeMillis();  
        System.out.println("-- 程序结束 --");  
        System.out.println("-- 耗时 --"+(time_2 - time_1)+"ms");  
    }  
  
  
}  

© 著作权归作者所有

共有 人打赏支持
就叫罗小黑吧
粉丝 2
博文 1
码字总数 1613
作品 0
成都
程序员
[转]Java大数据量导出Excel的问题

试共同条件: 数据总数为110011条,每条数据条数为19个字段。 电脑配置为:P4 2.67GHz,1G内存。 一、POI、JXL、FastExcel比较 POI、JXL、FastExcel均为java第三方开源导出Excel的开源项目。...

大冬 ⋅ 2011/07/28 ⋅ 1

Excel 导入导出工具--icexls

icexls是一个excel导入导出工具,依赖于poi或jxl,主要解决简单Excel的导入导出问题。它具有以下特点: 同时支持 poi和jxl两种api. 支持自定义sheet. 由导入方法(getData)和导出方法(setDat...

iceexcel ⋅ 2017/03/06 ⋅ 0

解读POI操作之表格导出(生成多个sheet)

Java表格导出的方式有很多,有前端弹出对话框的形式,有poi操作,有jxl操作,可以说实现的形式多种多样。下面我用的只是其中一个poi操作Excel表格,同时可以在一张表格中生成多个sheet,后端...

海岸线的曙光 ⋅ 03/28 ⋅ 0

springmvc + poi 导出excel 可以将结果的集的查询条件也放入到文件中么

基于springmvc框架,利用poi 实现一个导出excel的功能。 页面通过条件查询到结果,然后导出此结果到excel。 我使用的是springmvc的 AbstractExcelView类,通过继承这个类实现excel导出, 第一...

shaozhengmao ⋅ 2014/06/24 ⋅ 1

XXL-EXCEL v1.1.0 发布,Java 对象和 Excel 转换工具

XXL-EXCEL v1.1.0 发布,新特性如下: 1、字段支持Date类型。至此,已经支持全部基础数据类型。 2、Java转换Excel时,字段类型改为从Field上读取,避免Value为空时空指针问题。 3、升级POI至...

许雪里 ⋅ 2017/12/15 ⋅ 5

HSSFWorkBook本地excel导入导出

使用的时候要导入 poi架包 一、将数据库中的数据导出到指定计算家: package com.inspur; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; ...

QH_C ⋅ 2014/11/09 ⋅ 0

EasyPoi 2.14 版本更新,Excel/Word 的简易工具类

easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完...

Anotherjueyue ⋅ 2015/08/30 ⋅ 8

java poi导入导出2

1.创建一个新的Excel工作薄 [java] //创建新的Excel工作簿 HSSFWorkbookworkbook=new HSSFWorkbook(); //在Excel工作簿中建一工作表,其名为缺省值,也可以指定Sheet名称 HSSFSheetsheet=wor...

wsl_Mr ⋅ 2013/09/25 ⋅ 0

java实现excel的导入导出(poi)

首先我们要知道MS excel文件由什么组成,比如说sheet(一个工作表格),表格的行,单元格,单元格格式,单元格内容格式…这些都对应着poi里面的一个类。 一个excel表格:HSSFWorkbook wb = n...

黎嘉诚 ⋅ 2016/07/31 ⋅ 0

利用POI导出10W数据

导出数据到EXCEL表,目前数据为7W以上,03版本容量不够,想换成07版本。但是代码运行到SXSSFWorkbook wb = new SXSSFWorkbook();有问题, 是少包吗?目前导入包为:poi-3.9-20121203.jar,p...

皮蛋瘦肉粥里没有粥 ⋅ 2013/05/07 ⋅ 10

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部