文档章节

poi大数据导入导出 不分sheet

就叫罗小黑吧
 就叫罗小黑吧
发布于 2017/08/08 13:51
字数 1613
阅读 16
收藏 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
博文 3
码字总数 1642
作品 0
成都
程序员
[转]Java大数据量导出Excel的问题

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

大冬
2011/07/28
0
1
Excel 导入导出工具--icexls

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

iceexcel
2017/03/06
837
0
解读POI操作之表格导出(生成多个sheet)

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

海岸线的曙光
03/28
0
0
Java读取大数据量Excel的方法(POI)

2007Excel转换XML: 直接将后缀xlsx 改为 zip, 打开zip即可 zip包中的xml文件解读: (1)对于docProps目录下 这里core是文件的创建时间和修改时间,标题,主题和作者,app是文档的其他属性...

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

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

shaozhengmao
2014/06/24
985
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

ES6 Promise

Promise promise是异步编程的一种解决方案 1 什么是异步? 异步模式,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则...

NDweb
17分钟前
0
0
Python百分登顶年度编程语言排行榜

今天 IEEE Spectrum 发布了 2018 年度顶级编程语言排行榜。该榜单可根据流行趋势、职业方向、语言类型等多个标准各自细分生成榜单,也可以综合多个标准进行排列,使用者可以根据自己的需求过...

六库科技
21分钟前
0
0
consul笔记

安装和启动就不说了,很简单。 注册一个服务: http://localhost:8500/v1/agent/service/register put请求,json格式内容如下 { "ID": "userServiceId", //服务id "Name": "userService", //服...

朝如青丝暮成雪
21分钟前
0
0
iOS CollectionView 的那些事

UICollectionView是开发中用的比较多的一个控件,本文记录UICollectionView在开发中常用的方法总结,包括使用UICollectionViewFlowLayout实现Grid布局、添加Header/Footer、自定义layout布局...

aron1992
22分钟前
0
0
linux tar.gz zip 解压缩 压缩命令

http://apps.hi.baidu.com/share/detail/37384818 download ADT link http://dl.google.com/android/ADT-0.9.6.zip download SDK link http://dl.google.com/Android/android-sdk_r11-linux_......

owensliu
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部