poi大数据导入导出 详见附件 ExcelHelper.java 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.usermo
详见附件ExcelHelper.java
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; /** * 每月导出数据 * @author admin * */ public class ExcelHelper { public void sysnMouthData (){ System.out.println("开始导出数据"); /*从数据库中查数据 */ Calendar cal = Calendar.getInstance(); int month = cal.get(Calendar.MONTH); int year = cal.get(Calendar.YEAR); String date = null;// 上一月份 if (month < 10) { date = "" + year + 0 + month + "%"; } else { date = "" + year + month + "%"; } // 创建一个Excel文件 SXSSFWorkbook workbook = new SXSSFWorkbook();//SXSSFWorkbook是poi3.8之后采用的专门处理大数据到execl中 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("表头1"); headCell1.setCellStyle(cellStyle); headCell1 = hssfRow1.createCell(1); headCell1.setCellValue("表头2"); headCell1.setCellStyle(cellStyle); headCell1 = hssfRow1.createCell(2); headCell1.setCellValue("表头3"); headCell1.setCellStyle(cellStyle); headCell1 = hssfRow1.createCell(3); headCell1.setCellValue("表头4"); headCell1.setCellStyle(cellStyle); List<> daiqs = null; /** * 数据量过大,但又不能分sheet保存时 分批处理 */ Map map = new HashMap(); map.put("date", date); int total = userDao.countall(date);//从数据库中查询总数据 int page = 1; int minnum = 0; int maxnum = 1; int pagesize = 100000; if (total > pagesize) { page = total / pagesize + 1; } for (int i = 1; i <= page; i++) { minnum = (i - 1) * pagesize; if (i == page) { maxnum = total; } else { maxnum = i * pagesize; } daiqs = userDao.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("sdaf"+j); cell.setCellStyle(cellStyle); cell = hssfRow1.createCell(3); if (daiq.getOpercteType().trim().equals("1")) { cell.setCellValue("WEB_WAP"); } else if (daiq.getOpercteType().trim().equals("2")) { cell.setCellValue("WXCS_APP"); } else if (daiq.getOpercteType().trim().equals("3")) { cell.setCellValue("ANDROID_APP"); } else if (daiq.getOpercteType().trim().equals("4")) { cell.setCellValue("IOS_APP"); } else if (daiq.getOpercteType().trim().equals("5")) { cell.setCellValue("12580"); } cell.setCellStyle(cellStyle); cell = hssfRow1.createCell(4); cell.setCellValue(j); cell.setCellStyle(cellStyle); } if (i == page) { // 这里需要将最后剩下的数据也要刷到硬盘中去 sheet1.getRow(total - minnum * page); } } // 保存Excel文件 try { OutputStream outputStream = new FileOutputStream("test" + year + month + ".xlsx"); workbook.write(outputStream); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } }poi解析execl文件XML的方式
详见附件ExampleEventUserModelUtil.java
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); Iteratorsheets = 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 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 rowlist = new ArrayList (); 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