POI3.8中 大数据量的处理
大数据处理中的批量处理和流式处理技术

大数据处理中的批量处理和流式处理技术近年来,随着互联网技术的不断发展和普及,数据量越来越大,数据处理也变得越来越复杂。
针对这一问题,大数据处理中的批量处理和流式处理技术应运而生。
一、批量处理技术批量处理技术是指将处理的数据分成一批批进行处理。
这一技术的优点在于可以高效地处理大量数据,同时也能够进行较为复杂的计算。
批量处理常常用于数据挖掘、机器学习和数据分析等领域。
在批量处理中,数据会被分批次进行处理,每次处理的数据量称为“批次大小”。
批次大小的选择对于批量处理的效率和质量有着重要影响。
若批次过大,处理的时间会更长,但是若批次过小,处理的效率会受到影响。
因此,批量处理中需要合理选择批次大小。
常见的批量处理技术包括MapReduce、Hadoop等。
其中,MapReduce是一种分布式计算模型,主要应用于数据密集型计算中。
它把数据处理任务分成两个部分:Map部分和Reduce部分。
Map函数用于对原始数据进行处理,Reduce函数用于将Map函数处理过后的数据进行合并。
二、流式处理技术流式处理技术是指对于数据的一个不断变化的数据流进行处理。
这一技术的优点在于可以实时对数据进行处理,同时也能够使用连续的流进行数据处理。
流式处理主要应用于实时数据分析、数据监控等领域。
在流式处理中,由于数据源不断变化,需要对数据进行实时的捕捉和处理。
流式处理技术中的流量控制和数据均衡是其关键技术之一。
流量控制可以控制数据流的速率,防止数据流过大而导致系统崩溃。
数据均衡可以保证各台服务器上的数据负载相对均衡,从而提高系统的稳定性和效率。
常见的流式处理技术包括Storm、Spark Streaming等。
其中,Storm作为一个分布式实时计算系统,具有高性能和高可靠性等优点。
Spark Streaming是Apache Spark的一个组件,具有高可扩展性和实时处理效率高等优点。
三、批量处理与流式处理的综合应用批量处理技术和流式处理技术是两种不同的数据处理方式,它们各自具有优点和缺点。
数据分析师如何处理大数据量的情况

数据分析师如何处理大数据量的情况在当今信息爆炸的时代,大数据已经成为了各行各业的重要组成部分。
作为一名数据分析师,处理大数据量的情况是我们每天都要面对的挑战。
本文将探讨一些处理大数据量的有效方法,帮助数据分析师更好地应对这一挑战。
1. 数据清洗与预处理大数据往往包含大量的噪声和冗余信息,因此在进行数据分析之前,数据清洗与预处理是必不可少的步骤。
数据清洗包括删除重复数据、处理缺失值、修正错误数据等,以确保数据的准确性和一致性。
此外,还可以使用特定的算法和技术,如聚类、异常检测等,对数据进行预处理,以减少数据量和提取有用信息。
2. 数据存储和管理处理大数据量需要合适的数据存储和管理系统。
传统的关系型数据库在处理大数据时往往效率较低,因此可以考虑使用分布式存储系统,如Hadoop和NoSQL数据库。
这些系统能够将大数据分散存储在多个节点上,并通过并行计算来加速数据的处理和分析。
此外,还可以使用数据仓库和数据湖等技术,对数据进行整合和存储,以便后续的数据分析和挖掘。
3. 数据采样和抽样在处理大数据量时,完整地分析所有数据可能是不现实的,因此可以使用数据采样和抽样的方法来简化数据集。
采样是从整个数据集中选择一部分样本数据进行分析,而抽样则是从数据集中随机选择一些样本数据。
通过采样和抽样,可以在保证数据代表性的前提下,减少数据量,提高分析效率。
4. 并行计算和分布式处理大数据分析通常需要大量的计算资源和时间,因此并行计算和分布式处理是处理大数据量的关键技术。
并行计算是指将任务分解为多个子任务,并同时进行计算,以提高计算速度。
分布式处理则是将任务分发到多个计算节点上进行处理,以减少单个节点的负载。
这些技术可以通过使用并行计算框架,如Spark和MapReduce,来实现。
5. 数据可视化和故事讲述大数据分析的最终目标是从数据中提取有意义的信息和见解,并将其传达给相关的利益相关者。
因此,数据可视化和故事讲述是数据分析师必备的技能之一。
使用POI导出百万级数据到excel的解决方案

使⽤POI导出百万级数据到excel的解决⽅案1.HSSFWorkbook 和SXSSFWorkbook区别HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls,⼀张表最⼤⽀持65536⾏数据,256列,也就是说⼀个sheet 页,最多导出6w多条数据XSSFWorkbook:是操作Excel2007-2010的版本,扩展名是.xlsx对于不同版本的EXCEL⽂档要使⽤不同的⼯具类,如果使⽤错了,会提⽰如下错误信息。
org.apache.poi.openxml4j.exceptions.InvalidOperationExceptionorg.apache.poi.poifs.filesystem.OfficeXmlFileException它的⼀张表最⼤⽀持1048576⾏,16384列,关于两者介绍,对下⾯导出百万数据很重要,不要使⽤错了!2.使⽤SXSSFWorkbook对象,导出百万数据SXSSFWorkbook使⽤⽅法和 HSSFWorkbook差不多,如果你之前和我⼀样⽤的HSSFWorkbook,现在想要修改,则只需要将HSSFWorkbook改成SXSSFWorkbook即可,下⾯有我介绍,具体使⽤也可参考。
因项⽬业务,需要导出百万级数据到excel,在研究了各种⽅案后,最终确定了⽤POI的SXSSFWorkbook。
SXSSFWorkbook是POI3.8以上新增的,excel2007后每个sheet⽀持104万⾏数据。
3.如何将百万数据分成多个sheet页,导出到excel导出百万数据到excel,很简单,只需要将原来的HSSFWorkbook修改成SXSSFWorkbook,或者直接使⽤SXSSFWorkbook对象,它是直接⽤来导出⼤数据⽤的,有介绍,但是如果有300w条数据,⼀下导⼊⼀个excel的sheet页中,想想打开excel也需要⼀段时间吧,慢的话有可能导致程序⽆法加载,或者直接结束进程的情况发⽣4.先看导出后的效果由于百万数据太长了,这⾥只截取尾部效果图5.下⾯是Java代码部分/*** 使⽤ SXSSFWorkbook 对象实现excel导出* (⼀般是导出百万级数据的excel)*/public void exportBigDataExcel() {long startTime = System.currentTimeMillis(); //开始时间System.out.println("start execute time: " + startTime);// 1.创建⼯作簿// 阈值,内存中的对象数量最⼤值,超过这个值会⽣成⼀个临时⽂件存放到硬盘中SXSSFWorkbook wb = new SXSSFWorkbook(1000);//2.在Workbook中添加⼀个sheet,对应Excel⽂件中的sheetSheet sheet = wb.createSheet();//3.设置样式以及字体样式CellStyle titleCellStyle = createTitleCellStyle(wb);CellStyle headCellStyle = createHeadCellStyle(wb);CellStyle cellStyle = createCellStyle(wb);//4.创建标题、表头,内容和合并单元格等操作int rowNum = 0;// ⾏号// 创建第⼀⾏,索引从0开始Row row0 = sheet.createRow(rowNum++);row0.setHeight((short) 800);// 设置⾏⾼String title = "这⾥是标题标题标题";Cell c00 = row0.createCell(0);c00.setCellValue(title);c00.setCellStyle(titleCellStyle);// 合并单元格,参数依次为起始⾏,结束⾏,起始列,结束列(索引0开始)sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));//标题合并单元格操作,6为总列数 // 第⼆⾏Row row1 = sheet.createRow(rowNum++);row1.setHeight((short) 500);String[] row_first = {"填表单位:", "", "", "", "", " xxxx年第x季度 ", ""};for (int i = 0; i < row_first.length; i++) {Cell tempCell = row1.createCell(i);tempCell.setCellStyle(headCellStyle);if (i == 0) {tempCell.setCellValue(row_first[i] + "测试单位");} else if (i == 5) {tempCell.setCellStyle(headCellStyle);tempCell.setCellValue(row_first[i]);} else {tempCell.setCellValue(row_first[i]);}}// 合并sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 4));sheet.addMergedRegion(new CellRangeAddress(1, 1, 5, 6));//第三⾏Row row2 = sheet.createRow(rowNum++);row2.setHeight((short) 700);String[] row_second = {"名称", "采集情况", "", "", "登记情况", "", "备注"};for (int i = 0; i < row_second.length; i++) {Cell tempCell = row2.createCell(i);tempCell.setCellValue(row_second[i]);tempCell.setCellStyle(headCellStyle);}// 合并sheet.addMergedRegion(new CellRangeAddress(2, 3, 0, 0));//名称sheet.addMergedRegion(new CellRangeAddress(2, 2, 1, 3));//⼈数情况sheet.addMergedRegion(new CellRangeAddress(2, 2, 4, 5));//登记情况sheet.addMergedRegion(new CellRangeAddress(2, 3, 6, 6));//备注//第三⾏Row row3 = sheet.createRow(rowNum++);row3.setHeight((short) 700);String[] row_third = {"", "登记数(⼈)", "办证总数(⼈)", "办证率(%)", "登记户数(户)", "登记时间", ""};for (int i = 0; i < row_third.length; i++) {Cell tempCell = row3.createCell(i);tempCell.setCellValue(row_third[i]);tempCell.setCellStyle(headCellStyle);}// 数据处理(创建100万条测试数据)List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();for (int i = 0; i < 999999; i++) {Map<String,Object> map = new HashMap<String,Object>();map.put("name", "测试名称" + i);map.put("r1", "111");map.put("r2", "222");map.put("r3", "333");map.put("r4", "444");map.put("addTime", new DateTime());map.put("r6", "这⾥是备注"+i);dataList.add(map);}for (Map<String, Object> excelData : dataList) {Row tempRow = sheet.createRow(rowNum++);tempRow.setHeight((short) 500);// 循环单元格填⼊数据for (int j = 0; j < 7; j++) {Cell tempCell = tempRow.createCell(j);tempCell.setCellStyle(cellStyle);String tempValue;if (j == 0) {// 乡镇、街道名称tempValue = excelData.get("name").toString();} else if (j == 1) {// 登记数(⼈)tempValue = excelData.get("r1").toString();} else if (j == 2) {// 办证总数(⼈)tempValue = excelData.get("r2").toString();} else if (j == 3) {// 办证率(%)tempValue = excelData.get("r3").toString();} else if (j == 4) {// 登记户数(户)tempValue = excelData.get("r4").toString();} else if (j == 5) {// 登记⽇期tempValue = excelData.get("addTime").toString();} else {// 备注tempValue = excelData.get("r6").toString();}tempCell.setCellValue(tempValue);// sheet.autoSizeColumn(j);// 根据内容⾃动调整列宽,}}//设置列宽,必须在单元格设值以后进⾏sheet.setColumnWidth(0, 4000);//名称sheet.setColumnWidth(1, 3000);//登记数(⼈)sheet.setColumnWidth(2, 3000);//办证总数(⼈)sheet.setColumnWidth(3, 3000);//办证率(%)sheet.setColumnWidth(4, 3000);//登记户数(户)sheet.setColumnWidth(5, 6000);//登记时间sheet.setColumnWidth(6, 4000);//备注// 注释⾏Row remark = sheet.createRow(rowNum++);remark.setHeight((short) 500);String[] row_remark = {"注:表中的“办证率=办证总数÷登记数×100%”", "", "", "", "", "", ""};for (int i = 0; i < row_remark.length; i++) {Cell tempCell = remark.createCell(i);if (i == 0) {tempCell.setCellStyle(headCellStyle);} else {tempCell.setCellStyle(cellStyle);}tempCell.setCellValue(row_remark[i]);}int remarkRowNum = dataList.size() + 4;sheet.addMergedRegion(new CellRangeAddress(remarkRowNum, remarkRowNum, 0, 6));//注释⾏合并单元格 // 尾⾏Row foot = sheet.createRow(rowNum++);foot.setHeight((short) 500);String[] row_foot = {"审核⼈:", "", "填表⼈:", "", "填表时间:", "", ""};for (int i = 0; i < row_foot.length; i++) {Cell tempCell = foot.createCell(i);tempCell.setCellStyle(cellStyle);if (i == 0) {tempCell.setCellValue(row_foot[i] + "张三");} else if (i == 2) {tempCell.setCellValue(row_foot[i] + "李四");} else if (i == 4) {tempCell.setCellValue(row_foot[i] + "xxxx");} else {tempCell.setCellValue(row_foot[i]);}}int footRowNum = dataList.size() + 5;// 注sheet.addMergedRegion(new CellRangeAddress(footRowNum, footRowNum, 0, 1));sheet.addMergedRegion(new CellRangeAddress(footRowNum, footRowNum, 2, 3));sheet.addMergedRegion(new CellRangeAddress(footRowNum, footRowNum, 4, 6));long finishedTime = System.currentTimeMillis(); //处理完成时间System.out.println("finished execute time: " + (finishedTime - startTime)/1000 + "m");//导出HttpServletResponse response = this.getResponse();String fileName = "报表⽂件名称.xlsx";try {fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\"");OutputStream stream = response.getOutputStream();if (null != wb && null != stream) {wb.write(stream);// 将数据写出去wb.close();stream.close();long stopTime = System.currentTimeMillis(); //写⽂件时间System.out.println("write xlsx file time: " + (stopTime - startTime)/1000 + "m");}} catch (Exception e) {e.printStackTrace();}}CellStyle标题,表头,内容样式代码:private static CellStyle createTitleCellStyle(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBottomBorderColor(IndexedColors.BLACK.index);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setLeftBorderColor(IndexedColors.BLACK.index);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setRightBorderColor(IndexedColors.BLACK.index);cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setTopBorderColor(IndexedColors.BLACK.index);cellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.index); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);return cellStyle;}private static CellStyle createHeadCellStyle(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBottomBorderColor(IndexedColors.BLACK.index);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setLeftBorderColor(IndexedColors.BLACK.index);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setRightBorderColor(IndexedColors.BLACK.index);cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setTopBorderColor(IndexedColors.BLACK.index);cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);return cellStyle;}private static CellStyle createCellStyle(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBottomBorderColor(IndexedColors.BLACK.index);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setLeftBorderColor(IndexedColors.BLACK.index);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setRightBorderColor(IndexedColors.BLACK.index);cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setTopBorderColor(IndexedColors.BLACK.index);return cellStyle;}完毕!good luck!。
简述大数据处理的步骤

大数据处理的步骤一、数据收集大数据处理的第一步是数据收集。
由于大数据的来源广泛,数据类型多样,因此数据收集需要从各种数据源中获取数据。
数据源可能包括社交媒体、企业数据库、物联网设备等。
数据收集需要使用各种数据抓取、网络爬虫等技术,确保数据的全面性和准确性。
二、数据清洗在收集完数据后,需要进行数据清洗。
数据清洗的目的是去除重复、错误或不完整的数据,提高数据质量。
在数据清洗过程中,需要识别和处理缺失值、异常值和重复数据,确保数据的准确性和一致性。
三、数据转换数据转换是将原始数据转换成适合进行数据分析和挖掘的格式或结构。
在数据转换过程中,需要进行数据预处理,如特征工程、归一化等操作,以便更好地进行后续的数据分析和挖掘。
四、数据存储由于大数据的数据量庞大,需要选择合适的存储方式以方便后续处理和分析。
传统的关系型数据库已经不能满足大数据的处理需求,因此需要采用分布式存储系统,如Hadoop、Spark等,对大数据进行分布式存储和处理。
五、数据检索数据检索是在存储的数据中快速查找需要的数据。
为了提高检索效率,需要对数据进行索引和优化。
常用的索引技术包括B树、B+树等。
同时,还需要采用一些查询优化技术,如分布式查询、分页查询等,以提高数据的检索速度。
六、数据分析和挖掘数据分析是指使用统计和机器学习方法对数据进行深入分析,以发现数据中的规律和趋势。
挖掘则是指从大量数据中提取出有用的信息和知识。
在大数据处理中,常用的分析方法包括聚类分析、关联分析、分类和预测等。
通过这些方法,可以从大量数据中提取出有价值的信息和知识。
七、可视化呈现可视化呈现是将分析结果以直观的方式呈现给用户,帮助用户更好地理解数据和结果。
常用的可视化技术包括图表、地图、仪表板等。
通过这些技术,可以将复杂的数据和结果以简单明了的方式呈现给用户,提高数据的可读性和可理解性。
POI数据处理流程

POI数据处理流程说明一、POI数据分类的确定POI数据类别将会显示在门户的数据查询面板上面,确定POI数据分类为实现兴趣点数据查询的基础工作之一。
例如,省级POI数据分类可以参照如下列表。
70170270370470580180280380480580680780880880981081281381490190290390410011002100310041101110211035 生活服务生活服务(增加)11045 生活服务殡葬设施11051106二、POI数据结构的统一POI数据结构的确定,有利于后期增加新数据的操作。
数据结构可以参照如下:NAME 简称BZNAME 全称ADDRESS 地址PHONE 电话GB 国标DBCODE 代码ZHANDIAN 站点XIANLU 线路CODE1 分类CODE2 大类CODE3 小类DOMAINNAME 名称,可与NAME相同,作为显示STANDARDNAME 标准名称,需要包含行政区划全称,作为查询用PTYPE 分类,如地图查询、不显示等PLAYER 大类,如交通信息、教育机构等PCODE 小类,如加油站、中学等CITY 标准行政区划,如亚洲中国湖北省武汉市洪山区LEV 显示级别,控制兴趣点查询结果时候地图的显示级别JB 物理排序级别,控制兴趣点入库的顺序,显示的顺序实际操作的过程中,需要对原始数据进行属性的添加和删减,GeoStar5.3对源数据进行添加字段的操作中,不能添加中文名称的字段,实际应用中非常不方便。
三、POI数据内容的编辑在实际的应用中,需要有一个STANDARDNAME字段进行数据的查询,需要有一个DOMAINNAME字段进行数据的显示,需要PTYPE字段进行查询数据的控制,需要PLAYER、PCODE字段进行数据的分类显示,需要CITY字段进行数据的行政区划控制,需要LEV字段进行数据查询时控制地图的显示级别,需要JB字段控制数据入库、显示的先后顺序。
POI数据处理流程

POI数据处理流程POI(Point of Interest)数据处理流程是指对POI数据进行收集、清洗、整理、分析和应用的一系列操作。
以下是一个1200字以上的POI数据处理流程的详细介绍。
1. 收集数据:POI数据可以从各种渠道收集到,包括公开的数据库、第三方数据提供商、地图服务提供商等。
这些数据可以是结构化数据(如CSV、Excel文件)或非结构化数据(如文本文件、网页)。
收集数据的目的是获取要处理的原始数据集。
2.数据清洗:在进行数据分析前,需要对原始数据进行清洗。
数据清洗包括去除重复数据、处理缺失值、纠正错误数据等操作。
此外,还可以对数据进行规范化,如将地址转换为标准格式,统一单位等。
3. 数据整理:在清洗完数据后,需要对数据进行整理,使其适合后续的分析和应用。
数据整理包括数据格式转换、数据集成、数据标准化等。
可以使用数据库管理系统(如MySQL、Oracle)或数据处理工具(如Python的Pandas库)来完成这些操作。
4. 数据分析:数据分析是对POI数据进行统计、挖掘和模型构建等操作,以获得有用的信息和洞察力。
数据分析的方法包括聚类分析、分类分析、关联分析等。
可以使用统计分析工具(如R、SPSS)或机器学习工具(如Python的Scikit-learn库)进行数据分析。
5. 数据可视化:数据可视化是将POI数据以图表、地图等形式展示,使得数据更易于理解和解释。
数据可视化可以通过使用数据可视化工具(如Tableau、D3.js)或编程语言(如Python的Matplotlib库和Seaborn库)来实现。
6.数据应用:最后,将经过处理的POI数据应用到具体的业务场景中。
根据具体的需求,可以将POI数据用于地图导航、商业分析、城市规划等领域。
根据具体的应用需求,可能需要开发相应的应用程序或网站。
在进行POI数据处理的过程中,还需要注意以下几点:1.数据质量控制:在数据收集、清洗和整理过程中,需要对数据质量进行控制。
POI数据处理流程

POI数据处理流程1.数据获取:-从第三方数据提供商或开放数据源获取原始POI数据。
这些数据可能包括POI的名称、地址、坐标、类别、评分、评论等信息。
2.数据清洗:-去除重复数据:通过比较POI的唯一标识符(如ID或地址)来识别和删除重复的POI数据。
-处理缺失值:检查数据中缺少的字段,并采取适当的行动,如填充默认值、忽略该记录或使用插值方法进行估算。
-去噪声:检测和删除异常值或不一致的数据,如坐标超出范围或无效地址。
-字段转换:将数据字段的格式转换为统一的标准格式,如将经纬度的度分秒格式转换为十进制度格式。
3.数据整理:-标准化字段:对于同一类别的POI,确保字段名称和数据类型的一致性,以便后续的分析和比较。
-地理编码:对POI的地址进行地理编码,将地址转换为经纬度坐标。
-数据转换:将原始数据转换为适用于特定分析任务的格式,如将POI数据转换为点、线或面数据。
4.数据分析:-聚类分析:通过对POI数据进行聚类,可以识别出空间上的热点区域或高集中度区域,有助于了解城市建设和规划。
-时空分析:通过将POI数据与其他时空信息(如时间、人口、交通等)进行关联分析,可以揭示POI在不同时间和空间上的变化趋势和规律。
-空间可视化:通过在地图上绘制POI数据的分布和属性,可以更直观地展示POI的空间分布和特征。
5.结果输出:-数据可视化:通过图表、地图或其他可视化工具,将分析结果可视化展示,便于用户理解和决策。
-报告生成:将分析结果整理为报告,包括数据摘要、关键发现和可行建议。
-决策支持:将分析结果应用于实际决策支持系统中,帮助政府和企业做出合理的决策和规划。
需要注意的是,POI数据处理流程可能因具体任务和数据特点而有所差异。
以上流程仅为一个示例,实际应用可能需要根据具体情况进行适当调整和定制。
excel的大数据量用POI读取

excel的大数据量用POI读取
昨天刚解决了POI的大数据量写,今天又碰到一个问题,客户把50万的数据用excel传了过来T.T
普通的读取依然会OOM
无奈继续查资料。
记得看到一篇文章上说XSSF默认用DOM解析XML的,那必然会OOM了,于是开始找用SAX读的例子,找到了应该比较经典的FromHowTo.java(/repos/asf/poi/trunk/src/examples/src/org/apa che/poi/xssf/eventusermodel/examples/FromHowTo.java)
用这个例子还是碰到了挺多问题
1. 写入的逻辑会嵌入到这个读取里..它并没有提供比较友好的getRow之类的一行一行处理的方法..导致我的代码写地很猥琐..
2. SharedStringsTable sst = r.getSharedStringsTable();这段代码依然会抛OOM. 看提问频道有一个哥们也碰到了同样的问题..都已经用SAX解析了还是OOM是挺尴尬的..目前的解决方法是开大了一些内存..- -..简单有效..基本上代码跑过了这行以后的读取就不怕OOM了..。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
POI3.8中大数据量的处理
POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。
3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。
3.8版本的POI对excel的导出操作,一般只使用HSSFWorkbook以及SXSSFWorkbook,HSSFWorkbook 用来处理较少的数据量,SXSSFWorkbook用来处理大数据量以及超大数据量的导出。
HSSFWorkbook的使用方法和之前的版本的使用方法一致,这里就不在陈述使用方法了
SXSSFWorkbook的使用例子如下:
import junit.framework.Assert;
import ermodel.Cell;
import ermodel.Row;
import ermodel.Sheet;
import ermodel.Workbook;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
public static void main(String[] args) throws Throwable {
Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
Sheet sh = wb.createSheet();
for(int rownum = 0; rownum < 100000; rownum++){
Row row = sh.createRow(rownum);
for(int cellnum = 0; cellnum < 10; cellnum++){
Cell cell = row.createCell(cellnum);
String address = new CellReference(cell).formatAsString();
cell.setCellValue(address); }
}
FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx"); wb.write(out);
out.close();
}。