poi读取excel并输出到jsp页面

合集下载

JSP中导入导出Excel文件

JSP中导入导出Excel文件

JSP中导入导出Excel文件一.POI简介Jakarta POI 是apache的子项目,目标是处理ole2对象。

它提供了一组操纵Windows文档的Java API目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。

它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel 对象,你可以控制一些属性如sheet,cell等等。

二.HSSF概况HSSF 是sHorrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。

也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。

通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。

HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。

前者很好理解,后者比较抽象,但操作效率要高得多。

三.开始编码1 .准备工作要求:JDK 1.4+POI开发包可以到 /dyn/closer.cgi/jakarta/poi/ 最新的POI工具包2 . EXCEL 结构HSSFWorkbook excel 文档对象介绍HSSFSheet excel的表单HSSFRow excel的行HSSFCell excel的格子单元HSSFFont excel字体HSSFName 名称HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾和这个样式HSSFCellStyle cell样式辅助操作包括HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表4 .可参考文档POI 主页:/poi/,初学者如何快速上手使用POI HSSF/poi/hssf/quick-guide.html 。

代码例子/user1/6749/archives/2005/18347.html里面有很多例子代码,可以很方便上手。

poi教程

poi教程

poi教程Poi教程概述:Poi是一款Java库,用于处理Microsoft Office格式文件,如Excel、Word和PowerPoint。

它提供了丰富的API,使开发人员能够读取、写入和修改这些文件。

Poi教程内容:1. 安装Poi库:首先,你需要下载并安装Poi库。

你可以从Apache的官方网站上找到最新版本的Poi库。

安装过程包括将Poi库添加到你的Java项目的构建路径中。

2. 创建Excel文档:使用Poi,你可以创建一个新的Excel文档。

你可以定义工作表、行和单元格,并在单元格中添加数据。

你还可以设置单元格的格式,如字体、颜色和边框。

3. 读取Excel文件:Poi可以读取现有的Excel文件。

你可以打开一个文件并读取工作表、行和单元格中的数据。

你还可以根据需要筛选和处理数据。

4. 写入Excel文件:除了读取数据,Poi还可以将数据写入现有的Excel文件。

你可以创建新的工作表、行和单元格,并在其中插入数据。

你可以使用Poi的API来设置单元格的格式和其他属性。

5. 处理Word和PowerPoint文件:除了处理Excel文件,Poi还可以读取和写入Word和PowerPoint文件。

你可以打开Word文档并访问其中的段落、表格和其他元素。

你还可以修改PowerPoint演示文稿中的幻灯片、文本和图像。

6. 添加图表和图像:Poi提供了创建和修改图表的功能。

你可以使用Poi的API创建各种类型的图表,并在其中添加数据。

此外,你还可以在Excel文件中添加图像,并设置其大小、位置和其他属性。

7. 导出数据:一旦你完成了对Excel、Word或PowerPoint文件的处理,你可以使用Poi将其导出为其他格式,如PDF或HTML。

这使得你可以轻松地共享和打印处理过的文件。

8. 错误处理和异常处理:在使用Poi时,可能会遇到各种错误和异常。

你需要学会如何正确处理这些错误,以确保你的代码能够顺利运行。

poi 读取条件格式 -回复

poi 读取条件格式 -回复

poi 读取条件格式-回复Excel是一款功能强大的电子表格软件,可用于数据分析、数据处理、图表制作等。

它提供了许多有用的功能,其中之一是条件格式,它可以按照特定的条件来自动设置单元格的样式。

在本文中,我们将讨论如何使用poi 读取条件格式,并一步一步地解释该过程。

步骤一:准备工作首先,我们需要按照以下步骤准备工作:1. 确保你已经安装了Java Development Kit(JDK)和Eclipse集成开发环境(IDE)。

2. 下载并导入Apache POI库。

你可以从Apache的官方网站上下载POI 库,并将其导入到你的Eclipse项目中。

3. 确保你已经有一个Excel文件,其中包含条件格式。

步骤二:打开Excel文件在使用POI读取条件格式之前,我们首先需要打开Excel文件。

以下是使用POI打开Excel文件的示例代码:javaFileInputStream fis = newFileInputStream("path_to_your_excel_file");Workbook workbook = new XSSFWorkbook(fis);Sheet sheet = workbook.getSheetAt(0);在这段代码中,我们使用`FileInputStream`类来打开Excel文件,并使用`XSSFWorkbook`类和`getSheetAt()`方法来获取第一个工作表。

步骤三:获取单元格的条件格式一旦我们打开了Excel文件,我们就可以开始获取单元格的条件格式了。

以下是一个示例代码,可以帮助你理解如何实现该功能:javaSheetConditionalFormatting sheetCF =sheet.getSheetConditionalFormatting(); ConditionalFormatting[] cfRules =sheetCF.getConditionalFormattings();for (ConditionalFormatting cf : cfRules) {CellRangeAddress[] cellRanges = cf.getFormattingRanges();for (CellRangeAddress cellRange : cellRanges) {int firstRow = cellRange.getFirstRow();int lastRow = cellRange.getLastRow();int firstCol = cellRange.getFirstColumn();int lastCol = cellRange.getLastColumn();for (int row = firstRow; row <= lastRow; row++) {Row currentRow = sheet.getRow(row);for (int col = firstCol; col <= lastCol; col++) {Cell cell = currentRow.getCell(col);获取单元格的条件格式,并进行相关操作}}}}在这段代码中,我们首先获取了工作表的条件格式,并使用`getConditionalFormattings()`方法将其存储在`cfRules`数组中。

java的POI操作Excel文件

java的POI操作Excel文件

java的POI操作Excel文件(2)现在我要做的东西基本完成啦,我把这段时间使用POI的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI基本的使用方法,自己去看文档吧。

1、设置分页符的bugPOI里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。

Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak时POI会抛出空指针的异常。

解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。

如果sheet是由POI生成的则没有这个问题。

我跟踪了setRowBreak的源代码,发现是Sheet.Java下的PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel插入一个分页符来触发POI为rowBreaks创建实例。

2、如何拷贝行我在的POI用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写://注:this.fWorkbook是一个HSSHWorkbook,请自行在外部newpublic void copyRows(String pSourceSheetName,String pTargetSheetName,int pStartRow, int pEndRow,int pPosition){HSSFRow sourceRow = null;HSSFRow targetRow = null;HSSFCell sourceCell = null;HSSFCell targetCell = null;HSSFSheet sourceSheet = null;HSSFSheet targetSheet = null;Region region = null;int cType;int i;short j;int targetRowFrom;int targetRowTo;if ((pStartRow == -1) || (pEndRow == -1)){return;}sourceSheet = this.fWorkbook.getSheet(pSourceSheetName);targetSheet = this.fWorkbook.getSheet(pTargetSheetName);//拷贝合并的单元格for (i = 0; i < sourceSheet.getNumMergedRegions(); i++){region = sourceSheet.getMergedRegionAt(i);if ((region.getRowFrom() >= pStartRow) && (region.getRowTo() <= pEndRow)) {targetRowFrom = region.getRowFrom() - pStartRow + pPosition; targetRowTo = region.getRowTo() - pStartRow + pPosition;region.setRowFrom(targetRowFrom);region.setRowTo(targetRowTo);targetSheet.addMergedRegion(region);}}//设置列宽for (i = pStartRow; i <= pEndRow; i++){sourceRow = sourceSheet.getRow(i);if (sourceRow != null){for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++) {targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j));}break;}}//拷贝行并填充数据for (;i <= pEndRow; i++){sourceRow = sourceSheet.getRow(i);if (sourceRow == null){continue;}targetRow = targetSheet.createRow(i - pStartRow + pPosition);targetRow.setHeight(sourceRow.getHeight());for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)sourceCell = sourceRow.getCell(j);if (sourceCell == null){continue;}targetCell = targetRow.createCell(j);targetCell.setEncoding(sourceCell.getEncoding());targetCell.setCellStyle(sourceCell.getCellStyle());cType = sourceCell.getCellType();targetCell.setCellType(cType);switch (cType){case HSSFCell.CELL_TYPE_BOOLEAN:targetCell.setCellValue(sourceCell.getBooleanCellValue());break;case HSSFCell.CELL_TYPE_ERROR:targetCell.setCellErrorV alue(sourceCell.getErrorCellValue());break;case HSSFCell.CELL_TYPE_FORMULA://parseFormula这个函数的用途在后面说明targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula()));break;case HSSFCell.CELL_TYPE_NUMERIC:targetCell.setCellValue(sourceCell.getNumericCellV alue());break;case HSSFCell.CELL_TYPE_STRING:targetCell.setCellValue(sourceCell.getStringCellValue());break;}}}}这个函数有两个问题暂时无法解决:a、只能在同一个Workbook里面使用,跨Workbook总是拷不过去,不知道为什么?b、由于在拷贝行时也把行高也拷过去了,如果往这些单元格里写入的数据长度超过单元格长度,那么他们不会自动调整行高!3、公式的问题POI对Excel公式的支持是相当好的,但是我发现一个问题,如果公式里面的函数不带参数,比如now()或today(),那么你通过getCellFormula()取出来的值就是now(ATTR(semiV olatile))和today(ATTR(semiV olatile)),这样的值写入Excel是会出错的,这也是我上面copyRow的函数在写入公式前要调用parseFormula的原因,parseFormula这个函数的功能很简单,就是把ATTR(semiVolatile)删掉,我把它的代码贴出来:private String parseFormula(String pPOIFormula){final String cstReplaceString = "ATTR(semiV olatile)"; //$NON-NLS-1$StringBuffer result = null;int index;result = new StringBuffer();index = pPOIFormula.indexOf(cstReplaceString);if (index >= 0){result.append(pPOIFormula.substring(0, index));result.append(pPOIFormula.substring(index + cstReplaceString.length()));}else{result.append(pPOIFormula);}return result.toString();}至于为什么会出现ATTR(semiVolatile),还需要大家的探索精神!4、向Excel写入图片的问题。

poi读取Excel模板并修改模板内容与动态的增加行

poi读取Excel模板并修改模板内容与动态的增加行

poi读取Excel模板并修改模板内容与动态的增加⾏ 有时候我们可能遇到相当复杂的excel,⽐如表头的合并等操作,⼀种简单的⽅式就是直接代码合并(浪费时间),另⼀种就是写好模板,动态的向模板中增加⾏和修改指定单元格数据。

1.⼀个简单的根据模板sheet动态修改 原来的excel模板内容如下:现在的需求是动态的⽣成⽣成时间和⽣成⼈。

并且在第五⾏开始的数据列表增加5列:package cn.xm.exam.test;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import ermodel.Cell;import ermodel.XSSFCell;import ermodel.XSSFRow;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;public class DynamicOperateExcelUtils {public static void main(String[] args) throws IOException {// 读取源⽂件FileInputStream fis = new FileInputStream("G:/test.xlsx");XSSFWorkbook workBook = new XSSFWorkbook(fis);// 进⾏模板的克隆(接下来的操作都是针对克隆后的sheet)XSSFSheet sheet = workBook.cloneSheet(0);workBook.setSheetName(0, "sheet-0"); // 给sheet命名// 读取指定cell的内容XSSFCell nameCell = sheet.getRow(1).getCell(0);XSSFCell nameCell2 = sheet.getRow(1).getCell(1);System.out.println(nameCell.getStringCellValue());System.out.println(nameCell2.getStringCellValue());// 替换单元格内容(注意获取的cell的下标是合并之前的下标)replaceCellValue(sheet.getRow(1).getCell(2), "xxxxx时间");replaceCellValue(sheet.getRow(2).getCell(2), "xxxxx⼈");// 动态插⼊数据-增加⾏List<Map<String, Object>> datas = new ArrayList<>();for (int i = 0; i < 5; i++) {Map data = new HashMap<>();data.put("name", "name" + i);data.put("age", "age" + i);data.put("sex", "sex" + i);datas.add(data);}// 插⼊⾏sheet.shiftRows(4, 4 + datas.size(), datas.size(), true, false);// 第1个参数是指要开始插⼊的⾏,第2个参数是结尾⾏数,第三个参数表⽰动态添加的⾏数for (int i = 0; i < datas.size(); i++) {XSSFRow creRow = sheet.createRow(4 + i);creRow.setRowStyle(sheet.getRow(4).getRowStyle());creRow.createCell(0).setCellValue(datas.get(i).get("name").toString());creRow.createCell(1).setCellValue(datas.get(i).get("age").toString());creRow.createCell(2).setCellValue(datas.get(i).get("sex").toString());}// 输出为⼀个新的Excel,也就是动态修改完之后的excelString fileName = "test" + System.currentTimeMillis() + ".xlsx";OutputStream out = new FileOutputStream("G:" + "/" + fileName);workBook.removeSheetAt(0); // 移除workbook中的模板sheetworkBook.write(out);fis.close();out.flush();out.close();}/*** 替换单元格的内容,单元格的获取位置是合并单元格之前的位置,也就是下标都是合并之前的下表** @param cell* 单元格* @param value* 需要设置的值*/public static void replaceCellValue(Cell cell, Object value) {String val = value != null ? String.valueOf(value) : "";cell.setCellValue(val);}}结果: 上⾯需要注意的是:在替换的时候获取cell的时候获取的是合并单元格之前的cell位置,在动态增加⾏的时候⾏的其实和结束都是包含在内的。

JAVA用POI从Excel读取数据进行相关统计,JFreeChart绘制图表

JAVA用POI从Excel读取数据进行相关统计,JFreeChart绘制图表

代码大概三百行吧,不多。

本来连接数据库做是个不错的选择,但是我刚刷了系统木有了又懒得装,从txt输入又感觉太low,最后就作死选择了以前从未尝试过的从Excel 输入,并碰到了各种问题_(:зゝ∠)_比如Cannot get a String value from a numeric cell 的异常错误,卡了我好久,直到无语地发现POI操作Excel时会无视Excel里的单元格设置,自判数据类型,所以还要使用setCellType.(*゜ー゜*)实现步骤(1)我用javax.swing.JFileChooser类来显示文件对话框,让用户选择一个Excel文件。

(2)使用Apache POI API从Excel文件中读取数据,对Employee类进行批量初始化。

(3)实现公司员工收入的相关统计,这里我实现了人数统计、最大/最小工龄查找、最大/最小工资查找、男女比例、平均工资、平均年龄、平均工龄等。

(4)建立Dataset。

将你所想要显示的数据都放到这个库中。

(5)建立JFreeChart对象。

将你的dataset填入到这个对象中。

(6)处理Chart中文显示问题(7)设置各种JFreeChart的属性和效果。

通过它提供的各种方法和接口设置相关的属性。

(8)用JFreeChart绘制图表,然后按照个人的需求进行执行。

(9)写界面,以swing形式输出。

测试截图(1)生成消息对话框,要求用户选择一个Excel文件,单击“确定”(2)生成文件选择器,我打开了存放在D盘BUAA文件夹里的Employee.xls补充说明:这是文件Employee.xls的内容(3)进行相关统计,并通过消息对话框显示统计结果(4)询问用户是否生成统计图,如果点“取消”或“否”,运行完毕;如果点是,系统将生成统计图,以员工为横轴,以年龄、工龄、工资三项数值为纵轴。

图表的显示效果会根据窗口大小自适应,改变横纵轴的比例尺。

下面是窗口最大化的效果程序清单1 2 3 4 5 6 7 8public class Employee {String ID;String name;String sex;double age;double workAge;double sal;9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32public void setID(String ID) {this.ID = ID;}public void setName(String name) { = name;}public void setSex(String sex) {this.sex = sex;}public void setAge(double age) {this.age = age;}public void setWorkAge(double workAge) {this.workAge = workAge;}public void setSal(double sal) {this.sal = sal;}}一共有两个:Employee.Java和EmployeeStatic.javaEmployeeStatic.javaimport java.awt.RenderingHints;import java.io.FileInputStream;import java.util.ArrayList;import java.util.List;import javax.swing.JFileChooser;import javax.swing.JOptionPane;//org.apache.poiimport ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import ermodel.Cell;import ermodel.Row;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;//org.jfreeimport org.jfree.chart.ChartFactory;import org.jfree.chart.ChartFrame;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.title.TextTitle;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;import java.awt.Font;public class EmployeeStatics {public static void main(String[] args) {// TODO Auto-generated method stubJOptionPane.showMessageDialog(null,"\n您好,我是智能机器人小紫\n\n" + "很高兴为您提供员工数据统计分析服务\n\n"+ "请选择一个Excel文件 ^_^\n\n","选择Excel文件",RMATION_MESSAGE); ArrayList<Employee> Employees = null;//从Excel文件读取数据try {Employees = ReadFileUsingFileChooser();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}//人数统计int n = Employees.size();//最大最小工资、工龄、工资初始化int maxA = 0;int minA = Integer.MAX_VALUE;int maxWA = 0;int minWA = Integer.MAX_VALUE;int maxS = 0;int minS = Integer.MAX_VALUE;//男女性别人数int M = 0;int FM = 0;double sumS, sumA, sumWA, avgS, avgA, avgWA, MFM; sumS = sumA = sumWA = 0;//遍历实现相关统计for (Employee e : Employees) {if(e.age > maxA)maxA = (int) e.age;if(e.age < minA)minA = (int) e.age;if(e.workAge > maxWA)maxWA = (int) e.workAge;if(e.workAge < minWA)minWA = (int) e.workAge;if(e.sal > maxS)maxS = (int) e.sal;if(e.sal < minS)minS = (int) e.sal;sumS += e.sal;sumA += e.age;sumWA += e.workAge;if (e.sex.equals("男"))M++;if (e.sex.equals("女"))FM++;}//计算平均值avgS = sumS / n;avgA = sumA / n;avgWA = sumWA / n;//计算男女比例MFM = (double) M / FM;JOptionPane.showMessageDialog(null,"员工人数为" + n + ",男女比例为" + MFM + "(男/女)\n"+ "平均年龄为" + avgA + ",平均工龄为" + avgWA + ",平均工资为" + avgS + "\n"+ "最高年龄为" + maxA + ",最低年龄为" + minA + ",最高工龄为" + maxWA + ",最低工龄为" + minWA + "\n"+ "最高工资为" + maxS + "K,最低工资为" + minS + "K\n");int option=JOptionPane.YES_OPTION;option=JOptionPane.showConfirmDialog(null, "是否显示员工数据统计图?");if (option==JOptionPane.YES_OPTION) {CategoryDataset dataset = getDataSet(Employees);//构造chartJFreeChart chart = ChartFactory.createBarChart3D("员工数据统计图", // 图表标题"员工属性", // 目录轴的显示标签--横轴"数值", // 数值轴的显示标签--纵轴dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向:水平、true, // 是否显示图例(对于简单的柱状图必须false, // 是否生成工具false// 是否生成URL链接);//处理chart中文显示问题processChart(chart);//chart 以swing形式输出ChartFrame pieFrame = new ChartFrame("员工数据统计图", chart);pieFrame.pack();pieFrame.setVisible(true);}}public static ArrayList<Employee>ReadFileUsingFileChooser()throws Ex ception {// TODO Auto-generated method stubJFileChooser fileChooser = new JFileChooser();ArrayList temp = new ArrayList();if (fileChooser.showOpenDialog(null)==JFileChooser.APPROVE_OPTION) {java.io.File file = fileChooser.getSelectedFile();FileInputStream fileIn = new FileInputStream(file);//根据指定的文件输入流导入Excel从而产生Workbook对象HSSFWorkbook wb0 = new HSSFWorkbook(fileIn);//获取Excel文档中的第一个表单HSSFSheet sht0 = wb0.getSheetAt(0);//对Sheet中的每一行进行迭代int r;int rowNum = sht0.getPhysicalNumberOfRows();for (r = 1; r <= rowNum; r++) {Row row = sht0.getRow(r);if (row == null) {break;}//创建实体类Employee info=new Employee();//取出当前行第1个单元格数据,并封装在info实体stuName属性上row.getCell(0).(Cell.);info.setID(row.getCell(0).getStringCellValue());info.setName(row.getCell(1).getStringCellValue());info.setSex(row.getCell(2).getStringCellValue());info.setAge(row.getCell(3).getNumericCellValue());info.setWorkAge(row.getCell(4).getNumericCellValue());info.setSal(row.getCell(5).getNumericCellValue());temp.add(info);}fileIn.close();}else {System.out.println("No file selected");}return temp;}//获取一个演示用的组合数据集对象private static CategoryDatasetgetDataSet(ArrayList<Employee> Employe es) {DefaultCategoryDataset dataset = new DefaultCategoryDataset();for (Employee e : Employees){dataset.addValue(e.workAge, "工龄", );dataset.addValue(e.sal, "工资", );dataset.addValue(e.age, "年龄", );}return dataset;}//解决图表汉字显示问题private static void processChart(JFreeChart chart) {CategoryPlot plot = chart.getCategoryPlot();CategoryAxis domainAxis = plot.getDomainAxis();ValueAxis rAxis = plot.getRangeAxis();chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASI NG,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);TextTitle textTitle = chart.getTitle();textTitle.setFont(new Font("宋体", Font.PLAIN, 20));domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));rAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));rAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));// renderer.setItemLabelGenerator(newLabelGenerator(0.0));// renderer.setItemLabelFont(newFont("宋体", Font.PLAIN, 12));//renderer.setItemLabelsVisible(true);}}Employee.javapublic class Employee {String ID;String name;String sex;double age;double workAge;double sal;public void setID(String ID) {this.ID = ID;}public void setName(String name) { = name;}public void setSex(String sex) {this.sex = sex;}public void setAge(double age) {this.age = age;}public void setWorkAge(double workAge) { this.workAge = workAge;}public void setSal(double sal) {this.sal = sal;}}。

java poi excel 读写

java poi excel 读写

java poi excel 读写摘要:1.Java POI 简介2.Java POI Excel 读写功能3.使用Java POI 读取Excel 文件4.使用Java POI 写入Excel 文件5.总结与展望正文:Java POI 是一个开源的Java 库,它允许Java 开发人员操作Microsoft Office 文档,如Word、Excel、PowerPoint 等。

其中,Java POI Excel 提供了读取和写入Excel 文件的功能。

1.Java POI 简介Java POI 是一个基于Apache License 2.0 协议的开源项目,它为Java 开发人员提供了一种操作Microsoft Office 文档的方法。

Java POI 支持读取和写入多种Office 文档格式,包括Excel、Word、PowerPoint 等。

通过使用Java POI,开发人员可以在不安装Microsoft Office 的情况下,对Office 文档进行操作。

2.Java POI Excel 读写功能Java POI Excel 提供了丰富的API,允许Java 开发人员对Excel 文件进行读取和写入操作。

Excel 文件主要包括两种类型:XLS 和XLSX。

Java POI 支持这两种文件格式,同时还支持读取和写入XML 格式的Excel 文件。

3.使用Java POI 读取Excel 文件使用Java POI 读取Excel 文件主要包括以下几个步骤:(1) 导入相关的Java POI 库:```javaimport ermodel.*;import ermodel.XSSFWorkbook;import java.io.FileInputStream;import java.io.IOException;```(2) 创建一个Workbook 对象,表示Excel 文件:```javaWorkbook workbook = new XSSFWorkbook(new FileInputStream("example.xlsx"));```(3) 获取工作表:```javaSheet sheet = workbook.getSheetAt(0);```(4) 遍历工作表中的行和列,获取单元格数据:```javafor (Row row : sheet) {for (Cell cell : row) {String cellValue = getCellValue(cell);System.out.print(cellValue + "t");}System.out.println();}```4.使用Java POI 写入Excel 文件使用Java POI 写入Excel 文件主要包括以下几个步骤:(1) 创建一个新的Excel 文件:```javaWorkbook workbook = new XSSFWorkbook();```(2) 添加一个新的工作表:```javaSheet sheet = workbook.createSheet("Sheet1");```(3) 创建行:```javaRow row = sheet.createRow(0);```(4) 创建单元格,并设置单元格数据:```javaCell cell = row.createCell(0);cell.setCellValue("Hello, World!");```(5) 将数据写入Excel 文件:```javatry (FileOutputStream fileOut = newFileOutputStream("output.xlsx")) {workbook.write(fileOut);} catch (IOException e) {e.printStackTrace();}```5.总结与展望Java POI 是一个功能强大的Java 库,它允许Java 开发人员轻松地操作Microsoft Office 文档,如Excel、Word、PowerPoint 等。

poi教程

poi教程

内部资料不得拷贝POI报表--用POI与Excel交互AURISOFT第一章POI简介--Jakata Poi HSSF:纯java的Excel解决方案在我们实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。

在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。

或者是:我们已经习惯用Excel打印。

Apache的Jakata项目的POI子项目,目前比较成熟的是HSSF接口,处理MSExcel对象。

它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。

POI可以到下载到。

实际运行时,需要有poi包就可以了。

HSSF提供给用户使用的对象在ermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。

有以下几种对象:HSSFWorkbook excel的文档对象HSSFSheet excel的表单HSSFRow excel的行HSSFCell excel的格子单元HSSFFont excel字体HSSFDataFormat 日期格式在poi1.7中才有以下2项:HSSFHeader sheet头HSSFFooter sheet尾(只有打印的时候才能看到效果)和这个样式HSSFCellStyle cell样式辅助操作包括HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表以下可能需要使用到如下的类import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFDataFormat;import ermodel.HSSFFont;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFColor;先看poi的examples包中提供的最简单的例子,建立一个空xls文件。

jsp 中poi 实现导入导出excel

jsp 中poi 实现导入导出excel

1.excel导入数据导入时候注意数字类型和字符类型的区别,数字类型要在excel中设置数字类型,对应数据库中也应该建立对应类型<%@ page import="com.guanri.database.*,java.util.*,com.guanri.util.*,com.jspsmart.upload.*" contentType="text/html; charset=GBK" %><%@ pageimport="java.util.*,java.io.*,org.apache.poi.poifs.filesystem.*,ermodel.*" %><jsp:include page="/admin/checkLogin.jsp"/><%String result = "";String contracId = "";String projectname = "";double projectscale = 0;String projecttype="";String projectconunit="";double designtime = 0;String designphase = "";double completedtime = 0;String participants = "";String positionofpro = "";String dutiesas = "";int inum = 0;int unum = 0;int rnum = 0;int snum = 0;String rmstr = "";Table tb = new Table();Vector vc = null;Hashtable rows = new Hashtable();String sql = "";if(request.getMethod().equalsIgnoreCase("POST")) {String sdir = "/download/xlsdir/"; //文件保存目录String filesep=System.getProperty("file.separator");String ssdir = filesep+"download"+filesep+"xlsdir"+filesep;Calendar c = Calendar.getInstance();String fname = c.getTimeInMillis()+".xls";String sfname = sdir + fname;String ss = "xls"; //支持的文件后缀名try{SmartUpload su = new SmartUpload();su.initialize(pageContext);su.setAllowedFilesList(ss);su.upload();com.jspsmart.upload.File file = su.getFiles().getFile(0);if(!file.isMissing()){file.saveAs(sfname);// System.out.println(application.getRealPath("/")+ssdir+fname );FileInputStream finput = new FileInputStream(application.getRealPath("/")+ssdir+fname );//设定FileINputStream读取Excel档POIFSFileSystem fs = new POIFSFileSystem( finput );HSSFWorkbook wb = new HSSFWorkbook(fs);HSSFSheet sheet = wb.getSheetAt(0);//读取第一个工作表,宣告其为sheetfinput.close();HSSFRow row=null;//宣告一列HSSFCell cell=null;//宣告一个储存格short i=0;short y=0;//以巢状迴圈读取所有储存格资料System.out.println("sheet.getLastRowNum()="+sheet.getLastRowNum());for (i=1;i<=sheet.getLastRowNum();i++){row=sheet.getRow(i);for (y=1;y<=row.getLastCellNum();y++){cell=row.getCell(y);switch(y){case 1: //合同号if(cell!=null){contracId=(cell.getStringCellValue()).trim();}break;case 2: //项目名称if(cell!=null){projectname=(cell.getStringCellValue()).trim();}break;case 3: //项目规模if(cell!=null){projectscale=cell.getNumericCellValue();}break;case 4: //项目类型if(cell!=null){projecttype=(cell.getStringCellValue()).trim();}break;case 5: //项目建设单位if(cell!=null){projectconunit=(cell.getStringCellValue()).trim();}break;case 6: //设计时间if(cell!=null){designtime=cell.getNumericCellValue();}break;case 7: //设计阶段if(cell!=null){designphase=(cell.getStringCellValue()).trim();}break;case 8: //竣工时间if(cell!=null){completedtime=cell.getNumericCellValue();}break;case 9: //参与人姓名if(cell!=null){participants=(cell.getStringCellValue()).trim();}break;case 10: //担任项目职务if(cell!=null){positionofpro=(cell.getStringCellValue()).trim();}break;case 11: //担任职责if(cell!=null){dutiesas=(cell.getStringCellValue()).trim();}break;}}sql = "insert into hy_pro_briefinfo(contracId,projectname,projectscale,projecttype,projectconunit,designtime,designphase,completedtime, participants,positionofpro,dutiesas) ";sql+="values('"+contracId+"','"+projectname+"','"+projectscale+"','"+projecttype+"','"+projectconunit+"','"+(int)designti me+"','"+designphase+"','"+(int)completedtime+"','"+participants+"','"+positionofpro+"','"+dutiesas+"')"; //System.out.println(sql);snum = tb.update(sql);if(snum<=0){++rnum;rmstr = rmstr + ",";}else{++inum;}mit();tb.setCommit(true);// System.out.println("result="+result);//System.out.println("snum="+snum +"inum="+inum);}result = "共成功上传"+(inum+unum)+" 条记录,其中新增"+inum+" 条,更新"+unum+" 条;失败"+rnum+" 条("+rmstr+" )";// System.out.println(result);java.io.File f = new java.io.File(application.getRealPath("/")+ssdir+fname);f.delete();}else{result = "上传文件失败";}}catch(Exception ex){ex.printStackTrace();java.io.File f = new java.io.File(application.getRealPath("/")+ssdir+fname);//f.delete();// result = ex.getMessage();if(result.indexOf("1010")>0){result = "文件格式不对!只支持"+ss+"格式文件";}if("You cannot get a numeric value from a String based cell".equals(result)){result = "格式错误:在数字单元格中存在非数字!第"+(unum+inum+1)+"条记录出错";}}//finally{// response.sendRedirect("pro_per_info.jsp");// }}%><jsp:include page="/admin/BodyStart" />Ext.MessageBox.alert("提示",'<%=result %>');setTimeout("window.location.href='pro_per_info.jsp'", 1000);<jsp:include page="/admin/BodyEnd" />2.excel导出数据导出的时候注意中文编码的问题response.reset();response.setContentType("application/vnd.ms-excel");必须按照先后顺序书写<%@ page language="java"import="com.guanri.database.*,java.util.*,com.guanri.util.*,com.jspsmart.upload.*" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%><%@ page import="java.util.*,java.io.*,ermodel.*" %><%//response.setContentType("application/msexcel;charset=utf-8" );//response.setContentType("text/html;charset=utf-8");response.reset();response.setContentType("application/vnd.ms-excel");request.setCharacterEncoding("gb2312");String workSheetName = "pro_info.xls";response.setHeader("Content-disposition", "attachment; filename="+workSheetName);//WriteExcel we=new WriteExcel();//System.out.println("文件生成");//we.getExcel("steet1",response.getOutputStream());HSSFWorkbook workbook = new HSSFWorkbook(); //产生工作簿对象HSSFSheet sheet = workbook.createSheet(); //产生工作表对象sheet.setDefaultRowHeight((short) 10);sheet.setDefaultColumnWidth((short) 20);sheet.setColumnWidth((short) 4, (short) 10000);// 单位workbook.setSheetName(0,"firstSheet");// 设置字体HSSFFont font = workbook.createFont();// font.setFontHeightInPoints(( short ) 20 ); // 字体高度// font.setColor(HSSFFont.COLOR_RED); // 字体颜色font.setFontName( " 黑体" ); // 字体font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); // 宽度// font.setItalic( true ); // 是否使用斜体// font.setStrikeout(true); // 是否使用划线// 设置单元格类型HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setFont(font);cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 水平布局:居左边cellStyle.setWrapText( true );HSSFRow row = sheet.createRow((short)0);//产生第一行HSSFCell cell = row.createCell((short) 0);//产生第一个单元格 cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue("本公司项目统计信息");row = sheet.createRow((short) 1);//产生第二行cell = row.createCell((short) 0);//产生第一个单元格cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue("序号");cell = row.createCell((short) 1);//产生第二个单元格cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue("姓名");cell = row.createCell((short) 2);//产生第二个单元格cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue("项目名称");cell = row.createCell((short) 3);//产生第二个单元格cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue("项目类型");cell = row.createCell((short) 4);//产生第二个单元格cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue("项目规模");cell = row.createCell((short) 5);//产生第二个单元格cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue("担任项目职务");cell = row.createCell((short) 6);//产生第二个单元格cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("设计时间");cell = row.createCell((short) 7);//产生第二个单元格 cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("设计阶段");cell = row.createCell((short) 8);//产生第二个单元格 cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("项目建设单位");cell = row.createCell((short) 9);//产生第二个单元格 cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("竣工时间");cell = row.createCell((short) 10);//产生第二个单元格 cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("专项设计");cell = row.createCell((short) 11);//产生第二个单元格 cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("直属专业领导");Table tb = new Table();Vector vc = null;Hashtable rows=new Hashtable();String sql = "";sql = "select * from hy_pro_briefinfo where 1=1"; sql = sql + " order by participants";vc = tb.getContent(sql);// System.out.println(sql);// String result = "";int order=0;String contracId = "";String projectname = "";String projectscale = "";String projecttype="";String projectconunit="";double designtime = 0;String designphase = "";double completedtime = 0;String participants = "";String positionofpro = "";String dutiesas = "";String leader="";int iRow=2;String info="";String pername="";int num=1;for(int i=0;i<vc.size();i++){rows = (Hashtable)vc.get(i);order=i+1;participants=(String)rows.get("participants");if(!pername.equals(participants)){pername=participants;num=1;}else{num++;}// System.out.println("participants="+participants);projectname=(String)rows.get("projectname");projecttype=(String)rows.get("projecttype");// System.out.println("projectname="+projectname);positionofpro=(String)rows.get("positionofpro");// System.out.println("positionofpro="+positionofpro);designtime=((Integer)rows.get("designtime")).intValue();projectscale=(Double)rows.get("projectscale")+"";// System.out.println("designtime="+designtime);designphase=(String)rows.get("designphase");// System.out.println("designphase="+designphase);projectconunit=(String)rows.get("projectconunit");// System.out.println("projectconunit="+projectconunit);completedtime=((Integer)rows.get("completedtime")).intValue(); // System.out.println("completedtime="+completedtime);dutiesas=(String)rows.get("dutiesas");// System.out.println("dutiesas="+dutiesas);row= sheet.createRow((short)iRow);;for(int j=1;j<=11;j++){cell = row.createCell((short)(j-1));cell.setCellStyle(cellStyle); // 设置单元格样式cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setEncoding(HSSFCell.ENCODING_UTF_16);switch(j-1){case 0: //编号info=num+"";break;case 1: //姓名info=participants+"";break;case 2: //项目名称info=projectname+"";break;case 3: //项目类型info=projecttype+"";break;case 4: //面积info="建筑面积:"+projectscale+"平方米";break;case 5: //担任项目职务info=positionofpro+"";break;case 6: //设计时间info=designtime+"";info=info.substring(0,info.indexOf("."));break;case 7: //设计阶段info=designphase+"";break;case 8: //施工单位info=projectconunit+"";break;case 9: //竣工时间info=completedtime+"";info=info.substring(0,info.indexOf("."));if("0".equals(info)){info="";}break;case 10: //专项设计info=dutiesas+"";break; //直属专业领导case 11:info=leader+"";break;}//System.out.println("info="+info);cell.setCellValue(info);}iRow++;}OutputStream output=response.getOutputStream();output.flush();workbook.write(response.getOutputStream());output.close();%>。

JAVA使用POI(XSSFWORKBOOK)读取EXCEL文件过程解析

JAVA使用POI(XSSFWORKBOOK)读取EXCEL文件过程解析

JAVA使⽤POI(XSSFWORKBOOK)读取EXCEL⽂件过程解析经过⼀番搜索发现,java操纵excel⽂件常⽤的有jxl和poi两种⽅式,孰好孰坏看⾃⼰需求⽽定。

其中最主要的区别在于jxl不⽀持.xlsx,⽽poi⽀持.xlsx这⾥介绍的使⽤poi⽅式(XSSFWorkbook),实际上poi提供了HSSFWorkbook和XSSFWorkbook两个实现类。

区别在于HSSFWorkbook是针对.xls⽂件,XSSFWorkbook是针对.xslx⽂件。

⾸先明确⼀下基本概念: 先创建⼀个⼯作簿,⼀个⼯作簿可以有多个⼯作表,⼀个⼯作表可以有多个⾏,⼀个⾏可以有多个单元格 ⼯作簿 >>>>>>>>XSSFWorkbook ⼯作表 >>>>>>>>XSSFSheet ⾏ >>>>>>>>XSSFRow 单元格 >>>>>>>>XSSFCell下图为创建的student.xlsx的内容:读取student.xlsx⽂件代码:package com.zjk.testexcel;import ermodel.*;import java.io.FileInputStream;import java.io.IOException;/*** @Auther: zjk* @Date: 2019/8/30* @Description:*/public class TestExcel1 {public static void main(String[] args) {try {//创建⼯作簿XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("D:\\test-excel\\student.xlsx"));System.out.println("xssfWorkbook对象:" + xssfWorkbook);//读取第⼀个⼯作表(这⾥的下标与list⼀样的,从0开始取,之后的也是如此)XSSFSheet sheet = xssfWorkbook.getSheetAt(0);System.out.println("sheet对象:" + sheet);//获取第⼀⾏的数据XSSFRow row = sheet.getRow(0);System.out.println("row对象:" + row);//获取该⾏第⼀个单元格的数据XSSFCell cell0 = row.getCell(0);System.out.println("cello对象:" + cell0);} catch (IOException e) {e.printStackTrace();}}}控制台输出结果:可以发现具体到⾏对象时,就解析成xml⽂件了xssfWorkbook对象: Name: /xl/workbook.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xmlsheet对象: Name: /xl/worksheets/sheet1.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xmlrow对象: <xml-fragment r="1" spans="1:4" xmlns:r="/officeDocument/2006/relationships" xmlns:xdr="/drawingml/2006/spreadsheetDrawing" xmlns:x14="/office/spre <main:c r="A1" t="s"> <main:v>0</main:v> </main:c> <main:c r="B1" t="s"> <main:v>1</main:v> </main:c> <main:c r="C1" t="s"> <main:v>2</main:v> </main:c> <main:c r="D1" t="s"><main:v>3</main:v></main:c></xml-fragment>cello对象:姓名以上可以实现了读取某⾏某单元格的数据,那么接下来就该读取整个表的所有数据了:package com.zjk.testexcel;import ermodel.XSSFCell;import ermodel.XSSFRow;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;import java.io.FileInputStream;import java.io.IOException;/*** @Auther: zjk* @Date: 2019/8/30* @Description:*/public class TestExcel2 {public static void main(String[] args) {try {//创建⼯作簿XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("D:\\test-excel\\student.xlsx"));System.out.println("xssfWorkbook对象:" + xssfWorkbook);//读取第⼀个⼯作表XSSFSheet sheet = xssfWorkbook.getSheetAt(0);System.out.println("sheet对象:" + sheet); //获取最后⼀⾏的num,即总⾏数。

poi读取xlsx文件原理

poi读取xlsx文件原理

poi读取xlsx文件原理
POI读取XLSX文件的原理可以概括为以下几个步骤:
1.创建POI工作簿对象:首先,需要创建一个POI工作簿对象,该对象将代表Excel文件。

可以使用WorkbookFactory.create()方法来创建工作簿对象。

2.获取工作表对象:通过工作簿对象,可以获取到工作表对象。

可以使用getSheetAt()方法来获取特定索引的工作表对象,或者使用getSheetName()方法获取特定名称的工作表对象。

3.读取单元格数据:通过工作表对象,可以获取到单元格对象,并从中读取单元格数据。

可以使用getRow()方法获取行对象,然后使用getCell()方法获取单元格对象。

通过单元格对象,可以获取单元格的值、类型、格式等信息。

4.处理数据:在读取单元格数据后,可以根据需要进行数据处理。

例如,可以将数据存储到数据库中,或者将数据转换为其他格式。

5.关闭工作簿对象:最后,需要关闭工作簿对象,释放相关资源。

可以使用close()方法来关闭工作簿对象。

通过以上步骤,POI可以读取XLSX文件中的数据并进行处理。

需要注意的是,在使用POI读取Excel文件时,需要先安装相应的依赖库,例如Apache POI库。

同时,为了确保数据的准确性和完整性,需要对读取的数据进行校验和验证。

Java开发小技巧(六):使用ApachePOI读取Excel

Java开发小技巧(六):使用ApachePOI读取Excel

Java开发⼩技巧(六):使⽤ApachePOI读取Excel前⾔在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这⾥所说的数据源并⾮仅仅是指数据库,还包括excel、csv、xml等各种类型的数据接⼝⽂件,⽽这些⽂件中的数据不⼀定是结构化存储的,⽐如各种各样的报表⽂件,往往是⼀些复杂的表格结构,其中不仅有我们需要的数据,还有⼀些冗余的、⽆价值的数据,这时我们就⽆法直接⽤⼀般数据加载⼯具直接读取⼊库了。

也许你会想,数据源导出⽂件前先处理好数据就⾏了。

然⽽,实际开发中数据源往往是多个的,⽽且涉及到不同的部门甚⾄公司,这其间难免会出现各种⿇烦,甚⾄有些数据⽂件还是纯⼿⼯处理的,不⼀定能给到你满意的数据格式。

所以我们不讨论谁该负责转换的问题,这⾥主要介绍如何使⽤Apache POI来从Excel数据⽂件中读取我们想要的数据,以及⽤Bean Validation对数据内容按照预定的规则进⾏校验。

⽂章要点:Apache POI是什么如何使⽤Apache POI读取Excel⽂件使⽤Bean Validation进⾏数据校验Excel读取⼯具类使⽤实例Apache POI是什么Apache POI是⽤Java编写的免费开源的跨平台的Java API,提供API给Java程式对Microsoft Office格式档案进⾏读和写的操作。

如何使⽤Apache POI处理Excel⽂件1、导⼊Maven依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.17</version></dependency>2、创建Workbook实例这⾥需要注意的是Excel⽂档的版本问题,Excel2003及以前版本的⽂档使⽤HSSFWorkbook对象,Excel2007及之后版本使⽤HSSFWorkbook对象// Excel2003及以前版本Workbook workbook = new XSSFWorkbook(new FileInputStream(path));// Excel2007及之后版本Workbook workbook = new HSSFWorkbook(new FileInputStream(path));3、获取Sheet表格页对象Sheet是Excel⽂档中的⼯作簿即表格页⾯,读取前要先找到数据所在页⾯,可以通过标签名或者索引的⽅式获取指定Sheet对象// 按索引获取Sheet sheet = workbook.getSheetAt(index);// 按标签名获取4、获取Cell单元格对象// ⾏索引row和列索引col都是以 0 起始Cell cell = sheet.getRow(row).getCell(col);5、获取单元格内容获取单元格的值之前⾸先要获知单元格内容的类型,在Excel中单元格有6种类型:1. CELL_TYPE_BLANK :空值2. CELL_TYPE_BOOLEAN :布尔型3. CELL_TYPE_ERROR :错误4. CELL_TYPE_FORMULA :公式型5. CELL_TYPE_STRING:字符串型6. CELL_TYPE_NUMERIC:数值型各种类型的内容还需要进⼀步判断其数据格式,例如单元格的Type为CELL_TYPE_NUMERIC时,它有可能是Date类型,在Excel中的Date 类型是以Double类型的数字存储的,不同类型的值要调⽤cell对象相应的⽅法去获取,具体情况具体分析public Object getCellValue(Cell cell) {if(cell == null) {return null;}switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:return cell.getRichStringCellValue().getString();case Cell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {return cell.getDateCellValue();} else {return cell.getNumericCellValue();}case Cell.CELL_TYPE_BOOLEAN:return cell.getBooleanCellValue();case Cell.CELL_TYPE_FORMULA:return formula.evaluate(cell).getNumberValue();default:return null;}}6、关闭Workbook对象workbook.close();使⽤Bean Validation进⾏数据校验当你要处理⼀个业务逻辑时,数据校验是你不得不考虑和⾯对的事情,程序必须通过某种⼿段来确保输⼊进来的数据从语义上来讲是正确的或者符合预定义的格式,⼀个Java程序⼀般是分层设计的,⽽不同的层可能是不同的开发⼈员来完成,这样就很容易出现不同的层重复进⾏数据验证逻辑,导致代码冗余等问题。

java通过POI技术操作Excel(2)----模板读取,录入数据

java通过POI技术操作Excel(2)----模板读取,录入数据

java通过POI技术操作Excel(2)----模板读取,录⼊数据 先来回顾下通常把java对Excel的操作分为以下功能:1、⽣成模板,导出模板;2、填充模板,录⼊数据;3;读取数据库数据,导出数据;在上⼀篇博⽂中,我简单记录了模板⽣成和导出,在这篇博⽂中,主要来记录--Excel⽂件导⼊,数据录⼊(仍然是以jsp+servlet为例) 既然要解决这个问题,那⾸先来分析下我们需要⾯对的有哪些需求需要实现: 1、Excel⽂件导⼊(这是最基础的,巧妇难为⽆⽶之炊,导⼊环节也是查了好久才完成的); 2、Excel⽂件中数据的格式判定,你要读取⽂件,如果⽂件中其实没有数据怎么办,程序会报错么; 3、Excel⽂件中数据的数值判定,“编号”啊,“⾝份证号”啊之类是不是需要有⼀定的规范才说明数值是正确的,否则录⼊毫⽆意义,数据库中可能还会报错; 4、Excel⽂件中数据判定完成后,判定全部正确的,全部录⼊数据库,录⼊成功显⽰录⼊成功,录⼊不成功则修改录⼊环节; 判定如果存在错误,将所有出现错误的列汇总,返回界⾯提⽰所有出错的列;⾸先,我们来完成导⼊功能,实现如下效果:相信这个上传效果,很多⼈都能实现,<input type="file">如是⽽已嘛,但是实现它后我们如何进⾏excel数据操作呢?通常我们想到的有如下两种⽅法:1、将excel⽂件传上去,然后对传上的⽂件进⾏操作,因为我们传到哪了我们知道,可以直接获取路径;2、我们可以直接获取想要上传的⽂件在电脑上的路径,然后我们通过路径直接对⽂件进⾏操作;这⾥我主要来介绍下我实现的第⼆种⽅法,(以ie浏览器为例,其它浏览器暂不讨论)1function upLoad(){2var myFile=document.getElementById("myFile");3 myFile.select();4var realPath=document.selection.createRange().text;5var len=realPath.length;6var path=realPath.substr(len-4);7if(path==".xls"){ document.getElementById("myForm").action="upLoad?path="+realPath;8 document.getElementById("myForm").submit();9 }else{10 alert("请输⼊excel格式的⽂件");11 }12 }通常情况下,在ie7之前我们可以通过document.getElementById('file_upl').value 直接获取⽂本的本地路径,但是在ie8之后,处于安全性考虑,上传时获取以上value 值则会以“C:\fakepath\”来代替了,这个时候我们就需要上⽂中出现的var myFile=document.getElementById("myFile"); myFile.select();varrealPath=document.selection.createRange().text;这三步来进⾏完成了。

POI通用导出Excel(.xls,.xlsx)的方法

POI通用导出Excel(.xls,.xlsx)的方法

POI通⽤导出Excel(.xls,.xlsx)的⽅法POI操作EXCEL对象HSSF:操作Excel 97(.xls)格式XSSF:操作Excel 2007 OOXML (.xlsx)格式,操作EXCEL内存占⽤⾼于HSSFSXSSF:从POI3.8 beta3开始⽀持,基于XSSF,低内存占⽤。

使⽤POI的HSSF对象,⽣成Excel 97(.xls)格式,⽣成的EXCEL不经过压缩直接导出。

线上问题:负载服务器转发请求到应⽤服务器阻塞,以及内存溢出。

如果系统存在⼤数据量报表导出,则考虑使⽤POI的SXSSF进⾏EXCEL操作。

HSSF⽣成的Excel 97(.xls)格式本⾝就有每个sheet页不能超过65536条的限制。

XSSF⽣成Excel 2007 OOXML (.xlsx)格式,条数增加了,但是导出过程中,内存占⽤率却⾼于HSSF.SXSSF是⾃3.8-beta3版本后,基于XSSF提供的低内存占⽤的操作EXCEL对象。

其原理是可以设置或者⼿动将内存中的EXCEL⾏写到硬盘中,这样内存中只保存了少量的EXCEL⾏进⾏操作。

EXCEL的压缩率特别⾼,能达到80%,12M的⽂件压缩后才2M左右。

如果未经过压缩、不仅会占⽤⽤户带宽,且会导致负载服务器(apache)和应⽤服务器之间,长时间占⽤连接(⼆进制流转发),导致负载服务器请求阻塞,不能提供服务。

⼀定要注意⽂件流的关闭防⽌前台(页⾯)连续触发导出EXCEL1.通⽤核⼼导出⼯具类 ExcelUtil.javapackage sy.util;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import ng.reflect.Method;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import org.apache.poi.hpsf.SummaryInformation;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFClientAnchor;import ermodel.HSSFComment;import ermodel.HSSFFont;import ermodel.HSSFPatriarch;import ermodel.HSSFRichTextString;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.ss.formula.functions.T;import ermodel.CellStyle;import ermodel.DateUtil;import ermodel.Font;import org.apache.poi.ss.util.CellRangeAddress;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 com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;public class ExcelUtil{public static String NO_DEFINE = "no_define";//未定义的字段public static String DEFAULT_DATE_PATTERN="yyyy年MM⽉dd⽇";//默认⽇期格式public static int DEFAULT_COLOUMN_WIDTH = 17;/*** 导出Excel 97(.xls)格式,少量数据* @param title 标题⾏* @param headMap 属性-列名* @param jsonArray 数据集* @param datePattern ⽇期格式,null则⽤默认⽇期格式* @param colWidth 列宽默认⾄少17个字节* @param out 输出流*/public static void exportExcel(String title,Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) { if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;// 声明⼀个⼯作薄HSSFWorkbook workbook = new HSSFWorkbook();workbook.createInformationProperties();workbook.getDocumentSummaryInformation().setCompany("*****公司");SummaryInformation si = workbook.getSummaryInformation();si.setAuthor("JACK"); //填加xls⽂件作者信息si.setApplicationName("导出程序"); //填加xls⽂件创建程序信息si.setLastAuthor("最后保存者信息"); //填加xls⽂件最后保存者信息si.setComments("JACK is a programmer!"); //填加xls⽂件作者信息si.setTitle("POI导出Excel"); //填加xls⽂件标题信息si.setSubject("POI导出Excel");//填加⽂件主题信息si.setCreateDateTime(new Date());//表头样式HSSFCellStyle titleStyle = workbook.createCellStyle();titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);HSSFFont titleFont = workbook.createFont();titleFont.setFontHeightInPoints((short) 20);titleFont.setBoldweight((short) 700);titleStyle.setFont(titleFont);// 列头样式HSSFCellStyle headerStyle = workbook.createCellStyle();headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);HSSFFont headerFont = workbook.createFont();headerFont.setFontHeightInPoints((short) 12);headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerStyle.setFont(headerFont);// 单元格样式HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);HSSFFont cellFont = workbook.createFont();cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);cellStyle.setFont(cellFont);// ⽣成⼀个(带标题)表格HSSFSheet sheet = workbook.createSheet();// 声明⼀个画图的顶级管理器HSSFPatriarch patriarch = sheet.createDrawingPatriarch();// 定义注释的⼤⼩和位置,详见⽂档HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,0, 0, 0, (short) 4, 2, (short) 6, 5));// 设置注释内容comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));// 设置注释作者,当⿏标移动到单元格上是可以在状态栏中看到该内容.comment.setAuthor("JACK");//设置列宽int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//⾄少字节数int[] arrColWidth = new int[headMap.size()];// 产⽣表格标题⾏,以及设置列宽String[] properties = new String[headMap.size()];String[] headers = new String[headMap.size()];int ii = 0;for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {String fieldName = iter.next();properties[ii] = fieldName;headers[ii] = fieldName;int bytes = fieldName.getBytes().length;arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;sheet.setColumnWidth(ii,arrColWidth[ii]*256);ii++;}// 遍历集合数据,产⽣数据⾏int rowIndex = 0;for (Object obj : jsonArray) {if(rowIndex == 65535 || rowIndex == 0){if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第⼆页显⽰HSSFRow titleRow = sheet.createRow(0);//表头 rowIndex=0titleRow.createCell(0).setCellValue(title);titleRow.getCell(0).setCellStyle(titleStyle);sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));HSSFRow headerRow = sheet.createRow(1); //列头 rowIndex =1for(int i=0;i<headers.length;i++){headerRow.createCell(i).setCellValue(headers[i]);headerRow.getCell(i).setCellStyle(headerStyle);}rowIndex = 2;//数据内容从 rowIndex=2开始}JSONObject jo = (JSONObject) JSONObject.toJSON(obj);HSSFRow dataRow = sheet.createRow(rowIndex);for (int i = 0; i < properties.length; i++){HSSFCell newCell = dataRow.createCell(i);Object o = jo.get(properties[i]);String cellValue = "";if(o==null) cellValue = "";else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);else cellValue = o.toString();newCell.setCellValue(cellValue);newCell.setCellStyle(cellStyle);}rowIndex++;}// ⾃动调整宽度/*for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}*/try {workbook.write(out);workbook.close();} catch (IOException e) {e.printStackTrace();}}/*** 导出Excel 2007 OOXML (.xlsx)格式* @param title 标题⾏* @param headMap 属性-列头* @param jsonArray 数据集* @param datePattern ⽇期格式,传null值则默认年⽉⽇* @param colWidth 列宽默认⾄少17个字节* @param out 输出流*/public static void exportExcelX(String title,Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) { if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;// 声明⼀个⼯作薄SXSSFWorkbook workbook = new SXSSFWorkbook(1000);//缓存workbook.setCompressTempFiles(true);//表头样式CellStyle titleStyle = workbook.createCellStyle();titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);Font titleFont = workbook.createFont();titleFont.setFontHeightInPoints((short) 20);titleFont.setBoldweight((short) 700);titleStyle.setFont(titleFont);// 列头样式CellStyle headerStyle = workbook.createCellStyle();headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);Font headerFont = workbook.createFont();headerFont.setFontHeightInPoints((short) 12);headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerStyle.setFont(headerFont);// 单元格样式CellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);Font cellFont = workbook.createFont();cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);cellStyle.setFont(cellFont);// ⽣成⼀个(带标题)表格SXSSFSheet sheet = workbook.createSheet();//设置列宽int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//⾄少字节数 int[] arrColWidth = new int[headMap.size()];// 产⽣表格标题⾏,以及设置列宽String[] properties = new String[headMap.size()];String[] headers = new String[headMap.size()];int ii = 0;for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {String fieldName = iter.next();properties[ii] = fieldName;headers[ii] = headMap.get(fieldName);int bytes = fieldName.getBytes().length;arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;sheet.setColumnWidth(ii,arrColWidth[ii]*256);ii++;}// 遍历集合数据,产⽣数据⾏int rowIndex = 0;for (Object obj : jsonArray) {if(rowIndex == 65535 || rowIndex == 0){if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第⼆页显⽰SXSSFRow titleRow = sheet.createRow(0);//表头 rowIndex=0titleRow.createCell(0).setCellValue(title);titleRow.getCell(0).setCellStyle(titleStyle);sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));SXSSFRow headerRow = sheet.createRow(1); //列头 rowIndex =1for(int i=0;i<headers.length;i++){headerRow.createCell(i).setCellValue(headers[i]);headerRow.getCell(i).setCellStyle(headerStyle);}rowIndex = 2;//数据内容从 rowIndex=2开始}JSONObject jo = (JSONObject) JSONObject.toJSON(obj);SXSSFRow dataRow = sheet.createRow(rowIndex);for (int i = 0; i < properties.length; i++){SXSSFCell newCell = dataRow.createCell(i);Object o = jo.get(properties[i]);String cellValue = "";if(o==null) cellValue = "";else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);else if(o instanceof Float || o instanceof Double)cellValue= new BigDecimal(o.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();else cellValue = o.toString();newCell.setCellValue(cellValue);newCell.setCellStyle(cellStyle);}rowIndex++;}// ⾃动调整宽度/*for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}*/try {workbook.write(out);workbook.close();workbook.dispose();} catch (IOException e) {e.printStackTrace();}}//Web 导出excelpublic static void downloadExcelFile(String title,Map<String,String> headMap,JSONArray ja,HttpServletResponse response){ try {ByteArrayOutputStream os = new ByteArrayOutputStream();ExcelUtil.exportExcelX(title,headMap,ja,null,0,os);byte[] content = os.toByteArray();InputStream is = new ByteArrayInputStream(content);// 设置response参数,可以打开下载页⾯response.reset();response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename="+ new String((title + ".xlsx").getBytes(), "iso-8859-1")); response.setContentLength(content.length);ServletOutputStream outputStream = response.getOutputStream();BufferedInputStream bis = new BufferedInputStream(is);BufferedOutputStream bos = new BufferedOutputStream(outputStream);byte[] buff = new byte[8192];int bytesRead;while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {bos.write(buff, 0, bytesRead);}bis.close();bos.close();outputStream.flush();outputStream.close();}catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {int count = 100000;JSONArray ja = new JSONArray();for(int i=0;i<100000;i++){Student s = new Student();s.setName("POI"+i);s.setAge(i);s.setBirthday(new Date());s.setHeight(i);s.setWeight(i);s.setSex(i/2==0?false:true);ja.add(s);}Map<String,String> headMap = new LinkedHashMap<String,String>();headMap.put("name","姓名");headMap.put("age","年龄");headMap.put("birthday","⽣⽇");headMap.put("height","⾝⾼");headMap.put("weight","体重");headMap.put("sex","性别");String title = "测试";/*OutputStream outXls = new FileOutputStream("E://a.xls");System.out.println("正在导出xls....");Date d = new Date();ExcelUtil.exportExcel(title,headMap,ja,null,outXls);System.out.println("共"+count+"条数据,执⾏"+(new Date().getTime()-d.getTime())+"ms");outXls.close();*///OutputStream outXlsx = new FileOutputStream("E://b.xlsx");System.out.println("正在导出xlsx....");Date d2 = new Date();ExcelUtil.exportExcelX(title,headMap,ja,null,0,outXlsx);System.out.println("共"+count+"条数据,执⾏"+(new Date().getTime()-d2.getTime())+"ms"); outXlsx.close();}}class Student {private String name;private int age;private Date birthday;private float height;private double weight;private boolean sex;public String getName() {return name;}public void setName(String name) { = name;}public Integer getAge() {return age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public float getHeight() {return height;}public void setHeight(float height) {this.height = height;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public boolean isSex() {return sex;}public void setSex(boolean sex) {this.sex = sex;}public void setAge(Integer age) {this.age = age;}}2. 控制器Controller 的写法//导出配件列表@RequestMapping(value = "partExport")@ResponseBodypublic void partExportHttpServletResponse response){JSONArray ja = ptmpOrderService.selectStatExport();//获取业务数据集Map<String,String> headMap = ptmpOrderService.getPartStatHeadMap();//获取属性-列头String title = "配件统计表";ExcelUtil.downloadExcelFile(title,headMap,ja,response);}3.前端页⾯的写法(不要⽤异步⽅式请求,如$.post)//可以点击⼀个按钮事件触发下⾯的代码进⾏导出window.open("partExport","_blank");//或者可以提交表单$('#form').attr('action','partExport');$('#form').attr('target','_blank');$('#form').submit();4.POI依赖的jar包(maven pom)<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency>5.本地测试将10w条数据导出到本地硬盘中,HSSF⽅式⽤时14s左右,SXSSF⽅式⽤时24s左右,尽管如此,但建议使⽤SXSSF导出.xlsx的excel.之所以使⽤JSONArray作为数据集,⽽没有采⽤java的集合类,是因为JSONObject 在获取数据的时候是采⽤ get(key)的⽅式,正好与属性列对应,这样灵活性⾼,属性列不必与java对象的字段匹配。

poi根据excel模板文件导出数据

poi根据excel模板文件导出数据

1.import java.io.File;2.import java.io.FileInputStream;3.import java.io.FileNotFoundException;4.import java.io.FileOutputStream;5.import java.io.IOException;6.import java.util.Calendar;7.import java.util.Date;8.9.import ermodel.HSSFCell;10.import ermodel.HSSFSheet;11.import ermodel.HSSFWorkbook;12.import org.apache.poi.poifs.filesystem.POIFSFileSystem;13.import ermodel.RichTextString;14./**15. * 共分为六部完成根据模板导出excel操作:<br/>16. * 第一步、设置excel模板路径(setSrcPath)<br/>17. * 第二步、设置要生成excel文件路径(setDesPath)<br/>18. * 第三步、设置模板中哪个Sheet列(setSheetName)<br/>19. * 第四步、获取所读取excel模板的对象(getSheet)<br/>20. * 第五步、设置数据(分为6种类型数据:setCellStrValue、setCellDateValue、setCellDoubleValue、setCellBoolValue、setCellCalendarValue、setCellRichTextStrValue)<br/>21. * 第六步、完成导出(exportToNewFile)<br/>22. *23. * @author Administrator24. *25. */26.public class ExcelUtil {27.private String srcXlsPath = "";// // excel模板路径28.private String desXlsPath = "";29.private String sheetName = "";30. POIFSFileSystem fs = null;31. HSSFWorkbook wb = null;32. HSSFSheet sheet = null;33.34./**35. * 第一步、设置excel模板路径36. * @param srcXlsPath37. */38.public void setSrcPath(String srcXlsPath) {39.this.srcXlsPath = srcXlsPath;40. }41.42./**43. * 第二步、设置要生成excel文件路径44. * @param desXlsPath45. */46.public void setDesPath(String desXlsPath) {47.this.desXlsPath = desXlsPath;48. }49.50./**51. * 第三步、设置模板中哪个Sheet列52. * @param sheetName53. */54.public void setSheetName(String sheetName) {55.this.sheetName = sheetName;56. }57.58./**59. * 第四步、获取所读取excel模板的对象60. */61.public void getSheet() {62.try {63. File fi = new File(srcXlsPath);64.if(!fi.exists()){65. System.out.println("模板文件:"+srcXlsPath+"不存在!");66.return;67. }68. fs = new POIFSFileSystem(new FileInputStream(fi));69. wb = new HSSFWorkbook(fs);70. sheet = wb.getSheet(sheetName);71. } catch (FileNotFoundException e) {72. e.printStackTrace();73. } catch (IOException e) {74. e.printStackTrace();75. }76. }77.78./**79. * 第五步、设置字符串类型的数据80. * @param rowIndex--行值81. * @param cellnum--列值82. * @param value--字符串类型的数据83. */84.public void setCellStrValue(int rowIndex, int cellnum, String value) {85. HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);86. cell.setCellValue(value);87. }88.89./**90. * 第五步、设置日期/时间类型的数据91. * @param rowIndex--行值92. * @param cellnum--列值93. * @param value--日期/时间类型的数据94. */95.public void setCellDateValue(int rowIndex, int cellnum, Date value) {96. HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);97. cell.setCellValue(value);98. }99.100./**101. * 第五步、设置浮点类型的数据102. * @param rowIndex--行值103. * @param cellnum--列值104. * @param value--浮点类型的数据105. */106.public void setCellDoubleValue(int rowIndex, int cellnum, double value) {107. HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);108. cell.setCellValue(value);109. }110.111./**112. * 第五步、设置Bool类型的数据113. * @param rowIndex--行值114. * @param cellnum--列值115. * @param value--Bool类型的数据116. */117.public void setCellBoolValue(int rowIndex, int cellnum, boolean value) {118. HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);119. cell.setCellValue(value);120. }121.122./**123. * 第五步、设置日历类型的数据124. * @param rowIndex--行值125. * @param cellnum--列值126. * @param value--日历类型的数据127. */128.public void setCellCalendarValue(int rowIndex, int cellnum, Calendar va lue) {129. HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);130. cell.setCellValue(value);131. }132.133./**134. * 第五步、设置富文本字符串类型的数据。

Javapoi读取,写入Excel,处理row和cell可能为空的情况

Javapoi读取,写入Excel,处理row和cell可能为空的情况

Javapoi读取,写⼊Excel,处理row和cell可能为空的情况⾸先需要导⼊包import ermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;import ermodel.Row;import ermodel.Sheet;import ermodel.Workbook;然后写⽅法,由于我使⽤的框架全部是spring此处我只写⼊实现层和控制层代码@Overridepublic InputStream loadMatComYearPlanXls(String MAT_NO_, String MAT_DESC_, Integer MAT_TYPE_, String MAT_SPEC_CAT_CODE_, String COM_CODE_, String DEPT_CODE_, Integer YEAR_, Integer MONTH_, String MAT_BUDGE NPOIFSFileSystem fs = null;Workbook workbook = null;ByteArrayOutputStream baos = new ByteArrayOutputStream();try {File file = new File(this.getClass().getResource("/../../resource/matComYearPlan.xls").getFile());FileInputStream inputStream = new FileInputStream(file);fs = new NPOIFSFileSystem(inputStream);workbook = (Workbook) new HSSFWorkbook(fs.getRoot(), true);Sheet sheet = workbook.getSheetAt(0);List<Map<String, Object>> matYearPlanList = selectMatYearPlan(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_, MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BA List<Map<String, Object>> matTypedmCodeList = dmCodeService.selectDmCodeByGroupName("MAT_TYPE_", operator);List<Map<String, Object>> processStatusTypedmCodeList = dmCodeService.selectDmCodeByGroupName("PROCESS_STATUS_TYPE_", operator);List<Map<String, Object>> matBudgetCatList = matBudgetCatService.selectMatBudgetCat(1, -1, operator);List<Map<String, Object>> matSpecCatList = matSpecCatService.selectMatSpecCat(1, -1, operator);Map<String, Object> matYearPlan;String MAT_BUDGET_CAT_NAME_ = "";String PARENT_MAT_BUDGET_CAT_ID_;for (int i = 0; i < matYearPlanList.size(); i++) {matYearPlan = matYearPlanList.get(i);Row row = sheet.createRow(i + 1);row.createCell(0).setCellValue((String) matYearPlan.get("MAT_NO_"));row.createCell(1).setCellValue((String) matYearPlan.get("MAT_DESC_"));row.createCell(2).setCellValue((String) matYearPlan.get("LARGE_MAT_CAT_CODE_"));row.createCell(3).setCellValue((String) matYearPlan.get("UNIT_"));if (matYearPlan.get("PLANNED_PRICE_") != null) {row.createCell(4).setCellValue(((BigDecimal) matYearPlan.get("PLANNED_PRICE_")).doubleValue());}if (matYearPlan.get("AMOUNT_") != null) {row.createCell(5).setCellValue(((BigDecimal) matYearPlan.get("AMOUNT_")).doubleValue());}if (matYearPlan.get("PLANNED_PRICE_") != null && matYearPlan.get("AMOUNT_") != null) {row.createCell(6).setCellValue(((BigDecimal) matYearPlan.get("PLANNED_PRICE_")).doubleValue() * ((BigDecimal) matYearPlan.get("AMOUNT_")).doubleValue());}if (matYearPlan.get("MAT_TYPE_") != null) {for (int j = 0; j < matTypedmCodeList.size(); j++) {Map<String, Object> matTypedmCode = matTypedmCodeList.get(j);if ((((BigDecimal) matYearPlan.get("MAT_TYPE_")).intValue()) == (((BigDecimal) matTypedmCode.get("CODE_"))).intValue()) {row.createCell(7).setCellValue((String) matTypedmCode.get("VALUE_"));break;}}}row.createCell(8).setCellValue((String) matYearPlan.get("DEPT_NAME_"));for (int j = 0; j < matBudgetCatList.size(); j++) {Map<String, Object> matBudgetCat = matBudgetCatList.get(j);if (((String) matYearPlan.get("MAT_BUDGET_CAT_ID_")).equals((String) matBudgetCat.get("MAT_BUDGET_CAT_ID_"))) {MAT_BUDGET_CAT_NAME_ = (String) matBudgetCat.get("MAT_BUDGET_CAT_NAME_");PARENT_MAT_BUDGET_CAT_ID_ = (String) matBudgetCat.get("PARENT_MAT_BUDGET_CAT_ID_");while (PARENT_MAT_BUDGET_CAT_ID_ != null) {for (int k = 0; k < matBudgetCatList.size(); k++) {matBudgetCat = matBudgetCatList.get(k);if (PARENT_MAT_BUDGET_CAT_ID_.equals((String) matBudgetCat.get("MAT_BUDGET_CAT_ID_"))) {MAT_BUDGET_CAT_NAME_ = (String) matBudgetCat.get("MAT_BUDGET_CAT_NAME_") + "/" + MAT_BUDGET_CAT_NAME_;PARENT_MAT_BUDGET_CAT_ID_ = (String) matBudgetCat.get("PARENT_MAT_BUDGET_CAT_ID_");break;}}}row.createCell(9).setCellValue("/" + MAT_BUDGET_CAT_NAME_ + "/");break;}}if (matYearPlan.get("MAT_SPEC_CAT_CODE_") != null) {for (int j = 0; j < matSpecCatList.size(); j++) {Map<String, Object> matSpecCat = matSpecCatList.get(j);if (((String) matYearPlan.get("MAT_SPEC_CAT_CODE_")).equals((String) matSpecCat.get("CODE_"))) {row.createCell(10).setCellValue((String) matSpecCat.get("VALUE_"));break;}}}if (matYearPlan.get("PROCESS_STATUS_") != null) {for (int j = 0; j < processStatusTypedmCodeList.size(); j++) {Map<String, Object> processStatusTypedmCode = processStatusTypedmCodeList.get(j);if ((((BigDecimal) matYearPlan.get("PROCESS_STATUS_")).intValue()) == (((BigDecimal) processStatusTypedmCode.get("CODE_")).intValue())) {row.createCell(11).setCellValue((String) processStatusTypedmCode.get("VALUE_"));break;}}}}workbook.write(baos);baos.flush();byte[] bytes = baos.toByteArray();return new ByteArrayInputStream(bytes, 0, bytes.length);}catch (Exception e) {e.printStackTrace();return null;}finally {try {fs.close();workbook.close();baos.close();}catch (IOException e) {}}}其中有个selectMatYearPlan(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_,MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BATCH_ID_, 1, -1, operator);⽅法是我的业务⽅法,可根据需要改变⾃⼰实际的参数,对⾃⼰的代码进⾏修改Row row = sheet.createRow(i + 1);row.createCell(0).setCellValue((String) matYearPlan.get("MAT_NO_"));这两句代码是与其他⼈不同的地⽅,有些⼈的代码是getRow(),getCell()。

java使用poi读取ppt文件和poi读取excel、word示例

java使用poi读取ppt文件和poi读取excel、word示例

java使⽤poi读取ppt⽂件和poi读取excel、word⽰例Apache的POI项⽬可以⽤来处理MS Office⽂档,codeplex上还有⼀个它的.net版本。

POI项⽬可创建和维护操作各种基于OOXML和OLE2⽂件格式的Java API。

⼤多数MS Office都是OLE2格式的。

POI通HSMF⼦项⽬来⽀持Outlook,通过HDGF⼦项⽬来⽀持Visio,通过HPBF⼦项⽬来⽀持Publisher。

使⽤POI抽取Word简单⽰例:要引⼊poi-3.7.jat和poi-scratchpad-3.7.ajr这两个包。

复制代码代码如下:package msoffice;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.extractor.WordExtractor;import ermodel.CharacterRun;import ermodel.Paragraph;import ermodel.Range;import ermodel.Section;public class Word {// 直接抽取全部内容public static String readDoc1(InputStream is) throws IOException {WordExtractor extractor = new WordExtractor(is);return extractor.getText();}//分章节Section、段落Paragraph、字符串CharacterRun抽取public static void readDoc2(InputStream is) throws IOException {HWPFDocument doc=new HWPFDocument(is);Range r=doc.getRange();for(int x=0;x<r.numSections();x++){Section s=r.getSection(x);for(int y=0;y<s.numParagraphs();y++){Paragraph p=s.getParagraph(y);for(int z=0;z<p.numCharacterRuns();z++){CharacterRun run=p.getCharacterRun(z);String text=run.text();System.out.print(text);}}}}public static void main(String[] args) {File file = new File("/home/orisun/1.doc");try {FileInputStream fin = new FileInputStream(file);String cont = readDoc1(fin);System.out.println(cont);fin.close();fin = new FileInputStream(file);readDoc2(fin);fin.close();} catch (IOException e) {e.printStackTrace();}}}POI抽取PPT⽰例:复制代码代码如下:package msoffice;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import org.apache.poi.hslf.HSLFSlideShow;import org.apache.poi.hslf.extractor.PowerPointExtractor;import org.apache.poi.hslf.model.Slide;import org.apache.poi.hslf.model.TextRun;import ermodel.SlideShow;public class PPT {//直接抽取幻灯⽚的全部内容public static String readDoc1(InputStream is) throws IOException{ PowerPointExtractor extractor=new PowerPointExtractor(is);return extractor.getText();}//⼀张幻灯⽚⼀张幻灯⽚地读取public static void readDoc2(InputStream is) throws IOException{ SlideShow ss=new SlideShow(new HSLFSlideShow(is));Slide[] slides=ss.getSlides();for(int i=0;i<slides.length;i++){//读取⼀张幻灯⽚的标题String title=slides[i].getTitle();System.out.println("标题:"+title);//读取⼀张幻灯⽚的内容(包括标题)TextRun[] runs=slides[i].getTextRuns();for(int j=0;j<runs.length;j++){System.out.println(runs[j].getText());}}}public static void main(String[] args){File file = new File("/home/orisun/2.ppt");try{FileInputStream fin=new FileInputStream(file);String cont=readDoc1(fin);System.out.println(cont);fin.close();fin=new FileInputStream(file);readDoc2(fin);fin.close();}catch(IOException e){e.printStackTrace();}}}Excel⽂件由多个Workbook组成,⼀个Workbook由多个Sheet组成。

java使用poi自定义excel标题头并导出(springmvc+poi)

java使用poi自定义excel标题头并导出(springmvc+poi)

java使⽤poi⾃定义excel标题头并导出(springmvc+poi)项⽬使⽤的是jeecg开源框架(springmvc+spring+hibernate+。

等)此代码仅供参考!如有更好的意见或建议可留⾔。

创建excel⼤致分这⼏步:1、创建HSSFWorkbook对象(也就是excel⽂档对象)2、通过HSSFWorkbook对象创建sheet对象(也就是excel中的sheet)3、通过sheet对象创建HSSFROW对象(row⾏对象)4、通过HSSFROW对象创建列cell并set值(列名)1 controller 层23/**4 * excel⾃定义导出5 * @param hAqscTieupsummary6 * @param request7 * @param response8 * @param dataGrid9 * @param modelMap10 * @return11*/12 @SuppressWarnings("deprecation")13 @RequestMapping(params = "exportEXL")14public String exportEXL(HAqscTieupsummaryEntity hAqscTieupsummary,15 HttpServletRequest request, HttpServletResponse response,16 DataGrid dataGrid, ModelMap modelMap) {17try {18 String dateType = "yyyy";19 SimpleDateFormat df = new SimpleDateFormat(dateType);// 设置⽇期格式20 SimpleDateFormat df1 = new SimpleDateFormat("yyyy.MM.dd");// 设置⽇期格式21// 创建HSSFWorkbook对象(excel的⽂档对象)22 HSSFWorkbook wb = new HSSFWorkbook();23 HSSFRow row = null;24 HSSFCell cell = null;25// 建⽴新的sheet对象(excel的表单)并设置sheet名字26 HSSFSheet sheet = wb.createSheet("占压管线台账信息");27 sheet.setDefaultRowHeightInPoints(30);// 设置缺省列⾼sheet.setDefaultColumnWidth(20);//设置缺省列宽28//----------------标题样式---------------------29 HSSFCellStyle titleStyle = wb.createCellStyle(); //标题样式30 titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);31 titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);32 Font ztFont = wb.createFont();33 ztFont.setItalic(false); // 设置字体为斜体字34 ztFont.setColor(Font.COLOR_NORMAL); // 将字体设置为“红⾊”35 ztFont.setFontHeightInPoints((short)16); // 将字体⼤⼩设置为18px36 ztFont.setFontName("宋体"); // 将“宋体”字体应⽤到当前单元格上37 ztFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //加粗38// ztFont.setUnderline(Font.U_DOUBLE); // 添加(Font.U_SINGLE单条下划线/Font.U_DOUBLE双条下划线)39// ztFont.setStrikeout(true); // 是否添加删除线40 titleStyle.setFont(ztFont);41//-------------------------------------------42//----------------⼆级标题格样式----------------------------------43 HSSFCellStyle titleStyle2 = wb.createCellStyle(); //表格样式44 titleStyle2.setAlignment(HSSFCellStyle.ALIGN_CENTER);45 titleStyle2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);46 Font ztFont2 = wb.createFont();47 ztFont2.setItalic(false); // 设置字体为斜体字48 ztFont2.setColor(Font.COLOR_NORMAL); // 将字体设置为“红⾊”49 ztFont2.setFontHeightInPoints((short)11); // 将字体⼤⼩设置为18px50 ztFont2.setFontName("宋体"); // 字体应⽤到当前单元格上51 ztFont2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //加粗52// ztFont.setUnderline(Font.U_DOUBLE); // 添加(Font.U_SINGLE单条下划线/Font.U_DOUBLE双条下划线)53// ztFont.setStrikeout(true); // 是否添加删除线54 titleStyle2.setFont(ztFont2);55//----------------------------------------------------------56//----------------单元格样式----------------------------------57 HSSFCellStyle cellStyle = wb.createCellStyle(); //表格样式58 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);59 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);60 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框61 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框62 cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框63 cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框64 Font cellFont = wb.createFont();65 cellFont.setItalic(false); // 设置字体为斜体字66 cellFont.setColor(Font.COLOR_NORMAL); // 将字体设置为“红⾊”67 cellFont.setFontHeightInPoints((short)10); // 将字体⼤⼩设置为18px68 cellFont.setFontName("宋体"); // 字体应⽤到当前单元格上69// cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);70 cellStyle.setFont(cellFont);71 cellStyle.setWrapText(true);//设置⾃动换⾏72//----------------------------------------------------------73// ----------------------创建第⼀⾏---------------74// 在sheet⾥创建第⼀⾏,参数为⾏索引(excel的⾏),可以是0~65535之间的任何⼀个75 row = sheet.createRow(0);76// 创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何⼀个77 cell = row.createCell(0);78// 合并单元格CellRangeAddress构造参数依次表⽰起始⾏,截⾄⾏,起始列,截⾄列79 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 19));80// 设置单元格内容81 cell.setCellValue("占压城市地下管线、输油⽓管道、化⼯产品管道违法违规建设汇总表");82 cell.setCellStyle(titleStyle);83// ----------------------------------------------8485// ------------------创建第⼆⾏(单位、填表⽇期)---------------------86 row = sheet.createRow(1); // 创建第⼆⾏87 cell = row.createCell(0);88 cell.setCellValue("填报单位名称(盖章): ");89 cell.setCellStyle(titleStyle2);90 sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 3));91 cell = row.createCell(4);92 sheet.addMergedRegion(new CellRangeAddress(1, 1, 4, 5));93 TSBaseUser tb = ResourceUtil.getSessionUserName(); //获取当前登录⽤户信息94 String uid = tb.getId();95 String deptId = userDao.getDeptId(uid);96 String deptName = userDao.getDeptName(deptId);97 cell.setCellValue(deptName);98// cell.setCellValue("*****");99 cell.setCellStyle(titleStyle2);100 cell = row.createCell(13); // 填表时间101 sheet.addMergedRegion(new CellRangeAddress(1, 1, 13, 16));102 cell.setCellValue("填表时间:"+df1.format(new Date()));103 cell.setCellStyle(titleStyle2);104// HSSFCell cell14 = row.createCell(15); // 填表时间105// cell14.setCellValue();106// cell14.setCellValue("2017.11.30");107// cell14.setCellStyle(titleStyle2);108// ----------------------------------------------109110// ------------------创建表头start---------------------111 row = sheet.createRow(2); // 创建第三⾏112 sheet.addMergedRegion(new CellRangeAddress(2, 3, 0, 0));113 cell = row.createCell(0);114 cell.setCellValue("序号");115 cell.setCellStyle(cellStyle);116117 sheet.addMergedRegion(new CellRangeAddress(2, 3, 1, 1));118 cell = row.createCell(1);119 cell.setCellValue("隐患等级评定");120 cell.setCellStyle(cellStyle);121122 sheet.addMergedRegion(new CellRangeAddress(2, 3, 2, 2));123 cell = row.createCell(2);124 cell.setCellValue("隐患名称");125 cell.setCellStyle(cellStyle);126127 sheet.addMergedRegion(new CellRangeAddress(2, 2, 3, 5));128 cell = row.createCell(3);129 cell.setCellValue("位置描述");130 cell.setCellStyle(cellStyle);131132 cell = row.createCell(4);133 cell.setCellStyle(cellStyle);134 cell = row.createCell(5);135 cell.setCellStyle(cellStyle);136137 sheet.addMergedRegion(new CellRangeAddress(2, 2, 6, 10));138 cell = row.createCell(6);139 cell.setCellValue("管线情况");140 cell.setCellStyle(cellStyle);141142 cell = row.createCell(7);143 cell.setCellStyle(cellStyle);144 cell = row.createCell(8);145 cell.setCellStyle(cellStyle);146 cell = row.createCell(9);147 cell.setCellStyle(cellStyle);148 cell = row.createCell(10);149 cell.setCellStyle(cellStyle);150151 sheet.addMergedRegion(new CellRangeAddress(2, 2, 11, 13));152 cell = row.createCell(11);153 cell.setCellValue("占压物情况");154 cell.setCellStyle(cellStyle);155157 cell.setCellStyle(cellStyle);158 cell = row.createCell(13);159 cell.setCellStyle(cellStyle);160161 sheet.addMergedRegion(new CellRangeAddress(2, 2, 14, 14)); 162 cell = row.createCell(14);163 cell.setCellValue("占压物⽤途");164 cell.setCellStyle(cellStyle);165166 sheet.addMergedRegion(new CellRangeAddress(2, 3, 15, 15)); 167 cell = row.createCell(15);168 cell.setCellValue("已采⽤的安全防护措施");169 cell.setCellStyle(cellStyle);170171 sheet.addMergedRegion(new CellRangeAddress(2, 3, 16, 16)); 172 cell = row.createCell(16);173 cell.setCellValue("备注");174 cell.setCellStyle(cellStyle);175176 sheet.addMergedRegion(new CellRangeAddress(2, 3, 17, 17)); 177 cell = row.createCell(17);178 cell.setCellValue("联系⼈电话");179 cell.setCellStyle(cellStyle);180181 sheet.addMergedRegion(new CellRangeAddress(2, 3, 18, 18)); 182 cell = row.createCell(18);183 cell.setCellValue("是否已和区管委和供热办联系");184 cell.setCellStyle(cellStyle);185186 sheet.addMergedRegion(new CellRangeAddress(2, 3, 19, 19)); 187 cell = row.createCell(19);188 cell.setCellValue("是否采取防范措施");189 cell.setCellStyle(cellStyle);190191//--------------------------- 创建第四⾏--------------------192 row = sheet.createRow(3);193 sheet.addMergedRegion(new CellRangeAddress(3, 3, 3, 3)); 194 cell = row.createCell(3);195 cell.setCellValue("所在区县");196 cell.setCellStyle(cellStyle);197198 cell = row.createCell(0);199 cell.setCellStyle(cellStyle);200201 sheet.addMergedRegion(new CellRangeAddress(3, 3, 4, 4)); 202 cell = row.createCell(4);203 cell.setCellValue("所在街道");204 cell.setCellStyle(cellStyle);205206 cell = row.createCell(1);207 cell.setCellStyle(cellStyle);208209 sheet.addMergedRegion(new CellRangeAddress(3, 3, 5, 5)); 210 cell = row.createCell(5);211 cell.setCellValue("详细地址");212 cell.setCellStyle(cellStyle);213214 sheet.addMergedRegion(new CellRangeAddress(3, 3, 6, 6)); 215 cell = row.createCell(6);216 cell.setCellValue("管线建成时间");217 cell.setCellStyle(cellStyle);218219 sheet.addMergedRegion(new CellRangeAddress(3, 3, 7, 7)); 220 cell = row.createCell(7);221 cell.setCellValue("管线埋深");222 cell.setCellStyle(cellStyle);223224 sheet.addMergedRegion(new CellRangeAddress(3, 3, 8, 8)); 225 cell = row.createCell(8);226 cell.setCellValue("管径");227 cell.setCellStyle(cellStyle);228229 sheet.addMergedRegion(new CellRangeAddress(3, 3, 9, 9)); 230 cell = row.createCell(9);231 cell.setCellValue("管线压⼒等级");232 cell.setCellStyle(cellStyle);233234 sheet.addMergedRegion(new CellRangeAddress(3, 3, 10, 10)); 235 cell = row.createCell(10);236 cell.setCellValue("占压管线长度");237 cell.setCellStyle(cellStyle);238239 sheet.addMergedRegion(new CellRangeAddress(3, 3, 11, 11));241 cell.setCellValue("占压单位(个⼈)名称");242 cell.setCellStyle(cellStyle);243244 sheet.addMergedRegion(new CellRangeAddress(3, 3, 12, 12));245 cell = row.createCell(12);246 cell.setCellValue("占压物建成时间");247 cell.setCellStyle(cellStyle);248249 sheet.addMergedRegion(new CellRangeAddress(3, 3, 13, 13));250 cell = row.createCell(13);251 cell.setCellValue("占压物⾯积(平⽅⽶)");252 cell.setCellStyle(cellStyle);253254 sheet.addMergedRegion(new CellRangeAddress(3, 3, 14, 14));255 cell = row.createCell(14);256 cell.setCellValue("经营、出租、⾃⽤、居住");257 cell.setCellStyle(cellStyle);258259 cell = row.createCell(15);260 cell.setCellStyle(cellStyle);261 cell = row.createCell(16);262 cell.setCellStyle(cellStyle);263 cell = row.createCell(17);264 cell.setCellStyle(cellStyle);265 cell = row.createCell(18);266 cell.setCellStyle(cellStyle);267 cell = row.createCell(19);268 cell.setCellStyle(cellStyle);269//-------------------------表头end---------------------270 CriteriaQuery cq = new CriteriaQuery(HAqscTieupsummaryEntity.class,271 dataGrid);272 org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq,273 hAqscTieupsummary, request.getParameterMap());274 List<HAqscTieupsummaryEntity> hAqscTieupsummarys = this.hAqscTieupsummaryService 275 .getListByCriteriaQuery(cq, false);276for (int i = 0; i < hAqscTieupsummarys.size(); i++) { //向表格插⼊数据277 List<Object> data = new ArrayList<>(); //将前台传来的数据存⼊到list中278// System.out.println(hAqscTieupsummarys.get(i).getSeqNum());279 HAqscTieupsummaryEntity entity = hAqscTieupsummarys.get(i);280 data.add(entity.getSeqNum());281 String yhjb = entity.getYhDjpd();282 String hyjb = dao.getHyjb(yhjb);283 data.add(hyjb); //隐患级别284 data.add(entity.getYhName());285 String countryName = dao.getCountryByCode(entity.getAtcounty()); //区县286 data.add(countryName);287 String code = entity.getAtdistrict();288 String streetName = dao.getStreetByCode(code); //街道289 data.add(streetName);290 data.add(entity.getAddress());291 Date buildtime = entity.getPipelineBuildtime();292if (buildtime!=null) {293 String format = df.format(buildtime);294 data.add(format);295 }else{296 data.add("");297 }298 data.add(entity.getPipelineDepth());299 data.add(entity.getPipeSize());300 data.add(entity.getPipelinePr());301 data.add(entity.getTppipelineLength());302 data.add(entity.getTieupName());303 Date goodsBuildtime = entity.getTieupgoodsBuildtime();304if (buildtime!=null) {305 String format = df.format(goodsBuildtime);306 data.add(format);307 }else{308 data.add("");309 }310 data.add(entity.getTieupgoodsArea());311 String useType = entity.getTieupgoodsUse();312 data.add(dao.getUseType(useType));313 data.add(entity.getUseSecuritymeasures());314 data.add(entity.getRemark());315 data.add(entity.getTelephone());316 data.add(dao.getIsContact(entity.getIsContact()));317 data.add(entity.getIsUsesecuritymeasures());318int rowNum = 4+i; //从第四⾏开始319 row = sheet.createRow(rowNum);320for (int j = 0; j < data.size(); j++) { //将数据添加到单元格中321// System.out.println(data.get(j));322 sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum, j, j));323 cell = row.createCell(j);324 cell.setCellValue(""+data.get(j)+"");325 cell.setCellStyle(cellStyle);326 }327 }328329// 输出Excel⽂件330 OutputStream output = response.getOutputStream();331 response.reset();332 response.setHeader("Content-disposition",333 "attachment; filename=details.xls"); //filename = ⽂件名334 response.setContentType("application/msexcel");335 wb.write(output);336 output.close();337 } catch (IOException e) {338// TODO Auto-generated catch block339 e.printStackTrace();340 }341return null;342 }1前台请求地址:2 <t:dgToolBar title="导出" icon="icon-putout" funname="ExportXls"></t:dgToolBar>3//导出4function ExportXls() {5 JeecgExcelExport("hAqscTieupsummaryController.do?exportEXL","hAqscTieupsummaryList");6 }View Codeexcel导出模版如下:。

SpringBoot实现Excel导入导出好用到爆POI可以扔掉了

SpringBoot实现Excel导入导出好用到爆POI可以扔掉了

SpringBoot实现Excel导入导出好用到爆POI可以扔掉了SpringBoot是一个适用于开发Java应用程序的开源框架,可以用于构建独立的、可扩展且高效的应用程序。

在SpringBoot中,我们可以很方便地实现Excel的导入和导出功能,而且使用起来非常简单方便,大大提高了开发效率。

在传统的Java应用程序开发中,我们通常使用Apache POI这个库来处理Excel文件。

POI是一个非常强大的Java库,可以读写Excel文件,但是使用起来相对麻烦,并且需要大量的代码来处理各种复杂的Excel格式。

而在SpringBoot中,我们可以使用一些开源的库来简化Excel的导入导出操作,例如EasyExcel、JExcel和Apache POI提供的SXSSFWorkbook等。

首先,我们来看一下如何实现Excel的导入功能。

在SpringBoot中,我们可以使用EasyExcel这个库来实现Excel的导入功能。

EasyExcel是阿里巴巴开源的一个用于读写Excel文件的Java库,与Apache POI相比,EasyExcel的使用更加简洁高效。

要使用EasyExcel实现Excel的导入功能,我们只需要引入EasyExcel的依赖,并编写一些简单的代码即可。

下面是一个示例:1. 首先,我们需要在pom.xml文件中添加EasyExcel的依赖:```xml<dependency><artifactId>easyexcel</artifactId><version>2.2.11</version></dependency>```2. 接下来,我们需要创建一个用于处理Excel导入的Controller类,例如:```javapublic class ExcelControllertryEasyExcel.read(file.getInputStream(, ExcelData.class, new ExcelDataListener().sheet(.doRead(;return "导入成功";} catch (IOException e)e.printStackTrace(;return "导入失败";}}```3. 最后,我们需要创建一个实现`AnalysisEventListener`接口的类,用于处理Excel文件的数据。

POI操作Excel详解,读取xls和xlsx格式的文件

POI操作Excel详解,读取xls和xlsx格式的文件

POI操作Excel详解,读取xls和xlsx格式的⽂件package org.ian.webutil;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import jxl.Cell;import jxl.Sheet;import jxl.Workbook;import jxl.read.biff.BiffException;import mons.logging.Log;import mons.logging.LogFactory;import ermodel.XSSFCell;import ermodel.XSSFRow;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;public class ReadExcel {private static final Log log = LogFactory.getLog(ReadExcel.class);/*** 判断后缀分批⼊*/private static void parseSUCCEXX(String realPath,String fileName){String [] pfix= fileName.split("\\.");String suffix = pfix[pfix.length -1];if( suffix!=null&&!suffix.equals("")&&suffix.equals("xls")){System.out.println("xls");// jxl⽅法可读取.xls格式jlxExcel(realPath,fileName);}else if(suffix .equals("xlsx")){System.out.println("xlsx");// poi⽅法可读取Excel2007即.xlsx格式poiExcel(realPath,fileName);}}/*** 读取 xls JXL* @param realPath* @param fileName*/private static void jlxExcel(String realPath,String fileName){//===============jlx⽅法=================try{File fileDes = new File(realPath);InputStream str = new FileInputStream(fileDes);// 构造Workbook(⼯作薄)对象Workbook rwb=Workbook.getWorkbook(str);Sheet rs=rwb.getSheet(0);//获取第⼀张⼯作表int rsRows=rs.getRows();//获取Sheet表中所包含的总⾏数int rsCols=rs.getColumns();//获取Sheet表中所包含的总列数("========⾏========"+rsRows+"=====列========"+rsCols);for(int i=1;i<rsRows;i++){//读取⾏("========执⾏第========"+i+"⾏");for(int j=0;j<rsCols;j++){("========执⾏第========"+j+"列");Cell coo=rs.getCell(j, i);//单元格定位列,再定位⾏("========coo========"+coo);String strc=coo.getContents();//读取内容("========读取内容strc========"+strc);System.out.println("⽂件"+fileName+"的内容为:"+strc);}}rwb.close();}catch(FileNotFoundException e) {e.printStackTrace();} catch(BiffException e) {e.printStackTrace();} catch(IOException e) {e.printStackTrace();}//==========读取excel⽂件内容=结束=====================}/*** POI读取 xlsx* @param realPath* @param fileName*/private static void poiExcel(String realPath,String fileName){try{File fileDes = new File(realPath);InputStream str = new FileInputStream(fileDes);XSSFWorkbook xwb = new XSSFWorkbook(str); //利⽤poi读取excel⽂件流 XSSFSheet st = xwb.getSheetAt(0); //读取sheet的第⼀个⼯作表int rows=st.getLastRowNum();//总⾏数int cols;//总列数("========⾏========"+rows);for(int i=0;i<rows;i++){XSSFRow row=st.getRow(i);//读取某⼀⾏数据if(row!=null){//获取⾏中所有列数据cols=row.getLastCellNum();("========⾏========"+rows+"=====列========"+cols); for(int j=0;j<cols;j++){XSSFCell cell=row.getCell(j);if(cell==null){System.out.print(" ");}else{//判断单元格的数据类型switch(cell.getCellType()) {case XSSFCell.CELL_TYPE_NUMERIC: // 数字System.out.print(cell.getNumericCellValue() + " ");break;case XSSFCell.CELL_TYPE_STRING: // 字符串System.out.print(cell.getStringCellValue() + " ");break;case XSSFCell.CELL_TYPE_BOOLEAN: // BooleanSystem.out.println(cell.getBooleanCellValue() + " ");break;case XSSFCell.CELL_TYPE_FORMULA: // 公式System.out.print(cell.getCellFormula() + " ");break;case XSSFCell.CELL_TYPE_BLANK: // 空值System.out.println("");break;case XSSFCell.CELL_TYPE_ERROR: // 故障System.out.println("故障");break;default:System.out.print("未知类型 ");break;}}}}}}catch(IOException e){e.printStackTrace();}}/*** test* @param args*/public static void main(String[] args) { String fileName = "banShot.xlsx";String realPath = "d:/"+fileName;parseSUCCEXX(realPath, fileName); }}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

代码来源于网络,只做了部分修改,我也是刚用到很多都不懂,找了一些例子之类的自己用,有些不错的分享给大家,仅供参考。

下面这个是用servlet做(注意web.xml );其实原理一样;源码如下readExcelServlet.javapackage com.test.servlet;import java.io.FileInputStream;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import ermodel.HSSFCell;import ermodel.HSSFDateUtil;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;/*** author:wx * describe:Reads the Excel example **/public class readExcelServlet extends HttpServlet {/****/private static final long serialVersionUID = 1L;/*** * Constructor of the object.*/public readExcelServlet() {super();}/*** Destruction of the servlet. <br>**/public void destroy() {super.destroy();}// Just puts "destroy" string in log// Put your code here/*** doGet*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}/*** doPost*/public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=gb2312");PrintWriter out = response.getWriter();String filePath = new String(request.getParameter("file").getBytes("GBK"), "gb2312");//注意如果这里出现乱码导致文件路径错误试着改下GBK,换成ISO-8859-1out.print("文件路径:" + filePath + "<br>");try {POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filePath));// 创建工作簿HSSFWorkbook workBook = new HSSFWorkbook(fs);/*** 获得Excel中工作表个数*/out.println("工作表个数 :" + workBook.getNumberOfSheets() + "<br>");for (int i = 0; i < workBook.getNumberOfSheets(); i++) {out.println("<font color='red'> " + i+ " ***************工作表名称:"+ workBook.getSheetName(i)+ " ************</font><br>");// 创建工作表HSSFSheet sheet = workBook.getSheetAt(i);int rows = sheet.getPhysicalNumberOfRows(); // 获得行数if (rows > 0) {sheet.getMargin(HSSFSheet.TopMargin);for (int j = 0; j < rows; j++) { // 行循环HSSFRow row = sheet.getRow(j);if (row != null) {int cells = row.getLastCellNum();// 获得列数for (short k = 0; k < cells; k++) { // 列循环HSSFCell cell = row.getCell(k);if (cell != null) {String value = "";switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_NUMERIC:if (HSSFDateUtil.isCellDateFormatted(cell)) {// 如果是date类型则,获取该cell的date值value = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()).toString();out.println("第"+ j + "行,第" + k+ "列值:" + value + "<br>");} else {// 纯数字value = String.valueOf(cell.getNumericCellValue());out.println("第"+ j + "行,第" + k+ "列值:" + value + "<br>");}break;/* 此行表示单元格的内容为string类型*/case HSSFCell.CELL_TYPE_STRING: // 字符串型value = cell.getRichStringCellValue().toString();out.println("第" + j + "行,第" + k + "列值:"+ value + "<br>");break;caseHSSFCell.CELL_TYPE_FORMULA:// 公式型// 读公式计算值value = String.valueOf(cell .getNumericCellValue());if(value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串//value = cell .getRichStringCellValue().toString();}// cell.getCellFormula();读公式out.println("第" + j + "行,第" + k + "列值:"+ value + "<br>");break;caseHSSFCell.CELL_TYPE_BOOLEAN:// 布尔value = " "+cell.getBooleanCellValue();out.println("第" + j + "行,第" + k + "列值:"+ value + "<br>");break;/* 此行表示该单元格值为空 */case HSSFCell.CELL_TYPE_BLANK: // 空值value = "";out.println("第" + j + "行,第" + k + "列值:"+ value + "<br>");break;case HSSFCell.CELL_TYPE_ERROR: // 故障value = "";out.println("第" + j + "行,第" + k + "列值:"+ value + "<br>");break;default:value = cell.getRichStringCellValue().toString();out.println("第" + j + "行,第" + k + "列值:"+ value + "<br>");}}}}}}}} catch (Exception ex) {ex.printStackTrace();}out.print("<script>alert('解析完毕');</script>");out.flush();out.close();}public void init() throws ServletException {// Put your code here}}下面是jsp页面;readExcel.jsp<%@page language="java"import="java.util.*"pageEncoding="gb2312"%> <%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'readExcel.jsp' starting page</title><meta http-equiv="pragma"content="no-cache"><meta http-equiv="cache-control"content="no-cache"><meta http-equiv="expires"content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description"content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form action="readExcelServlet"method="post">上传附件:<input type="file"name="file"><br><input type="submit"value="开始解析"></form><br><br><br><form action="ToExcel"><input type="submit"value="导出Excel"></form></body></html>。

相关文档
最新文档