使用POI读取excel文件内容

合集下载

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时,可能会遇到各种错误和异常。

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

java获取excel文件内容的方法

java获取excel文件内容的方法

一、介绍在开发过程中,我们经常会遇到需要读取Excel文件内容的情况。

而Java作为一种广泛应用的编程语言,具有丰富的库和功能,使得它成为一种很好的选择。

本文将介绍如何使用Java来获取Excel文件的内容,并将分为以下几个部分来进行讲解。

二、使用POI库进行Excel文件操作POI(Poor Obfuscation Implementation)是Apache基金会的一个开源项目,它为Java程序提供了读取和写入Microsoft Office格式文件的功能。

具体来说,POI库中的HSSF模块可以用于读取和操作Excel文件。

以下是使用POI库进行Excel文件操作的步骤。

1. 引入POI库首先需要引入POI库的相关依赖。

可以通过Maven来引入POI库,添加以下依赖到项目的pom.xml文件中即可:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>```2. 读取Excel文件接下来,我们可以通过POI库的相关类来读取Excel文件。

首先需要创建一个文件输入流来读取Excel文件,然后通过HSSFWorkbook类来加载文件内容,最后可以通过遍历的方式获取Excel文件的内容。

以下是一个简单的示例:```javaFileInputStream file = new FileInputStream("example.xls"); HSSFWorkbook workbook = new HSSFWorkbook(file); HSSFSheet sheet = workbook.getSheetAt(0);for (Row row : sheet) {for (Cell cell : row) {// 处理单元格的内容}}```3. 处理Excel文件内容在读取Excel文件内容后,我们可以通过POI库提供的类来处理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位置,在动态增加⾏的时候⾏的其实和结束都是包含在内的。

POI读写海量Excel(详细解读)

POI读写海量Excel(详细解读)

POI读写海量Excel(详细解读)目前处理Excel的开源javaAPI主要有两种,一是Jxl(Java Excel API),Jxl只支持Excel2021以下的版本。

另外一种是Apache的Jakarta POI,相比于Jxl,POI对微软办公文档的支持更加强大,但是它使用复杂,上手慢。

POI可支持更高的Excel版本2021。

对Excel的读取,POI有两种模式,一是用户模式,这种方式同Jxl的使用很类似,使用简单,都是将文件一次性读到内存,文件小的时候,没有什么问题,当文件大的时候,就会出现OutOfMemory的内存溢出问题。

第二种是事件驱动模式,拿Excel2021来说,其内容采用XML的格式来存储,所以处理excel就是解析XML,而目前使用事件驱动模式解析XML的API是SAX(Simple API for XML),这种模型在读取XML文档时,并没有将整个文档读入内存,而是按顺序将整个文档解析完,在解析过程中,会主动产生事件交给程序中相应的处理函数来处理当前内容。

因此这种方式对系统资源要求不高,可以处理海量数据。

笔者曾经做过测试,这种方法处理一千万条,每条五列的数据花费大约11分钟。

可见处理海量数据的文件事件驱动是一个很好的方式。

而本文中用到的AbstractExcel2021Reader、AbstractExcel2021Reader对Excel的读取都是采用这种POI的事件驱动模式。

至于Excel的写操作,对较高版本的Excel2021,POI提供了很好的支持,主要流程是第一步构建工作薄和电子表格对象,第二步在一个流中构建文本文件,第三步使用流中产生的数据替换模板中的电子表格。

这种方式也可以处理海量数据文件。

AbstractExcel2021Writer就是使用这种方式进行写操作。

对于写入较低版本的Excel2021,POI使用了用户模式来处理,就是将整个文档加载进内存,如果数据量大的话就会出现内存溢出的问题,Excel2021Writer就是使用这种方式。

POI3.10读取Excel模板填充数据后生成新的Excel文件

POI3.10读取Excel模板填充数据后生成新的Excel文件

POI3.10读取Excel模板填充数据后⽣成新的Excel⽂件private final DecimalFormat df = new DecimalFormat("#0.00");public void test(){String filePath = "G:\\tmp\\qhjt_yd.xls";String destPath = "G:\\tmp\\qhjt_yd2.xls";List<Map<String,Double>> list = getData();Map<String,String> nsrxx = getBaseInfo();try {//读取excel模板HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(filePath));//读取第⼀个⼯作簿HSSFSheet sheet = workbook.getSheetAt(0);//设置保留公式sheet.setForceFormulaRecalculation(true);//定义⾏与列HSSFRow row;HSSFCell cell;//第3⾏,第2列row = sheet.getRow(2);cell = row.getCell(1);cell.setCellValue(nsrxx.get("nsrmc"));//第3⾏,第4列row = sheet.getRow(2);cell = row.getCell(3);cell.setCellValue(nsrxx.get("bsq"));//第13⾏,第3列row = sheet.getRow(12);cell = row.getCell(2);cell.setCellValue(nsrxx.get("ycsm"));//第14⾏,第2列row = sheet.getRow(13);cell = row.getCell(1);cell.setCellValue(nsrxx.get("tbr"));//第14⾏,第5列row = sheet.getRow(13);cell = row.getCell(4);cell.setCellValue(nsrxx.get("lxdh"));//从第6⾏开始读取到第12⾏for(int i=5;i<12;i++){Map<String,Double> mm = list.get(i-5);//获取⾏row = sheet.getRow(i);//依次设置3,4列cell = row.getCell(2);cell.setCellValue(df.format(mm.get("bq")));cell = row.getCell(3);cell.setCellValue(df.format(mm.get("tq")));}FileOutputStream out = new FileOutputStream(destPath);workbook.write(out);out.close();} catch (IOException ex) {Logger.getLogger(PoiUtil.class.getName()).log(Level.SEVERE, null, ex);}}。

java使用poi(XSSFWorkbook)读取excel(.xlsx)文件

java使用poi(XSSFWorkbook)读取excel(.xlsx)文件

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

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

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

⾸先明确⼀下基本概念: 先创建⼀个⼯作簿,⼀个⼯作簿可以有多个⼯作表,⼀个⼯作表可以有多个⾏,⼀个⾏可以有多个单元格 ⼯作簿 ----------->XSSFWorkbook ⼯作表 ----------->XSSFSheet ⾏ ----------->XSSFRow 单元格 ----------->XSSFCell下图为创建的student.xlsx的内容:导⼊依赖:<!--poi--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.0</version></dependency>读取student.xlsx⽂件代码:1package com.zjk.testexcel;23import ermodel.*;4import java.io.FileInputStream;5import java.io.IOException;67/**8 * @Auther: zjk9 * @Date: 2019/8/3010 * @Description:11*/12public class TestExcel1 {13public static void main(String[] args) {14try {15//创建⼯作簿16 XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("D:\\test-excel\\student.xlsx"));17 System.out.println("xssfWorkbook对象:" + xssfWorkbook);18//读取第⼀个⼯作表(这⾥的下标与list⼀样的,从0开始取,之后的也是如此)19 XSSFSheet sheet = xssfWorkbook.getSheetAt(0);20 System.out.println("sheet对象:" + sheet);21//获取第⼀⾏的数据22 XSSFRow row = sheet.getRow(0);23 System.out.println("row对象:" + row);24//获取该⾏第⼀个单元格的数据25 XSSFCell cell0 = row.getCell(0);26 System.out.println("cello对象:" + cell0);27 } catch (IOException e) {28 e.printStackTrace();29 }30 }31 }控制台输出结果:可以发现具体到⾏对象时,就解析成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/spreadsheetDraw <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,即总⾏数。

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;}}。

poi数据使用

poi数据使用

poi数据使用POI(Apache POI)是一个用于操作Microsoft Office格式文件(如doc、xls、ppt等)的Java API。

它提供了一组类和方法,使开发人员可以轻松地读取、写入和操作Office文档中的数据。

本文将介绍如何使用POI来处理poi数据。

二、POI数据读取1. 导入POI库首先,我们需要在项目中导入POI库。

可以下载POI的jar文件,然后将其添加到项目的classpath中。

2. 创建工作簿和工作表使用POI来读取poi数据之前,我们需要创建一个工作簿和一个工作表对象。

可以使用HSSFWorkbook和HSSFSheet类来分别代表工作簿和工作表。

3. 读取数据使用POI的API方法,我们可以逐行或逐列读取poi数据。

可以使用HSSFRow和HSSFCell类来分别代表行和单元格。

通过遍历行和列的方式,可以获取到相应的数据。

三、POI数据写入1. 创建工作簿和工作表与数据读取类似,我们首先需要创建一个工作簿和一个工作表对象。

可以使用HSSFWorkbook和HSSFSheet类来分别代表工作簿和工作表。

2. 写入数据使用POI的API方法,我们可以将数据写入到指定的单元格中。

可以使用HSSFRow和HSSFCell类来分别代表行和单元格。

可以通过设置单元格的值来进行数据的写入操作。

四、POI数据操作注意事项1. 数据格式转换在进行POI数据读取或写入操作时,需要注意数据的格式转换。

例如,将数字类型的数据转换为字符串,或将字符串类型的数据转换为日期类型。

2. 数据校验在写入数据之前,我们需要进行数据校验,确保所写入的数据符合需求。

例如,对于字符串类型的数据,可以进行长度、格式等校验。

3. 数据样式设置为了使POIpoi数据的呈现更加美观,我们可以设置数据的样式。

可以使用HSSFCellStyle类来设置单元格的字体、背景色、边框等样式。

本文介绍了如何使用POI对poi数据进行读取和写入操作。

poi 读取数据的正确方法

poi 读取数据的正确方法

poi 读取数据的正确方法在使用POI读取数据的过程中,正确的方法可以分为以下几个步骤:1.导入相关的POI库:首先需要在项目中引入POI的相关库文件。

POI主要包含了对Microsoft Office格式文档的支持,包括Word、Excel和PowerPoint等文档格式。

在导入POI库之前,需要确保已经正确配置了Java开发环境。

2.创建工作簿对象:使用POI之前,需要先创建一个工作簿对象,用于操作Excel文件。

在POI中,工作簿是最高级别的容器,它代表一个Excel文件。

代码示例:```javaWorkbook workbook = new XSSFWorkbook(); //创建一个工作簿对象```3.获取工作表对象:在工作簿中,可以包含多个工作表。

通过工作簿对象可以获取指定的工作表对象。

代码示例:```javaSheet sheet = workbook.getSheetAt(0); //获取第一个工作表对象```4.获取行对象:在工作表中,可以包含多行数据。

通过工作表对象可以获取指定的行对象。

代码示例:```javaRow row = sheet.getRow(0); //获取第一行对象```5.获取单元格对象:在每一行中,可以包含多个单元格。

通过行对象可以获取指定的单元格对象。

代码示例:```javaCell cell = row.getCell(0); //获取第一个单元格对象```6.读取单元格的值:在获取到单元格对象后,可以读取单元格中的值。

POI提供了多种方法来读取不同类型的单元格值,包括文本、数字、日期等。

代码示例:```javaString value = cell.getStringCellValue(); //获取单元格的文本值```7.遍历工作表中的数据:可以使用循环逐行逐列地遍历工作表中的数据。

代码示例:```javafor (Row row : sheet) {for (Cell cell : row) {//读取单元格的值String value = cell.getStringCellValue();//处理单元格的值// ...}}```8.关闭工作簿对象:在读取完数据后,需要关闭工作簿对象,释放资源。

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程序⼀般是分层设计的,⽽不同的层可能是不同的开发⼈员来完成,这样就很容易出现不同的层重复进⾏数据验证逻辑,导致代码冗余等问题。

使用poi读取excel时,getRow()方法返回null

使用poi读取excel时,getRow()方法返回null

使⽤poi读取excel时,getRow()⽅法返回null新⼈⼀枚,说说今天在⼯作上遇到的问题。

由于⼯作需要,在做⼀个下载excel⽂件的功能时,要求读取服务器上的模板⽂件写⼊数据,然后再传输到客户端。

我刚⼯作没多久,⽽且因为某些原因接触到的技术太少,所以就⽤读取模板上的标题与从数据库中取的的数据进⾏关联,然后写⼊,如果有更好的⽅法,请赐教。

写完测试的时候遇到了⼀个问题,就是模板上第⼀⾏标题⾏有数据,但是⽤getRow()⽅法取到的Row却为null,懵逼了,查了好久查不出来,百度也搜不到,最后跟⾃⼰写的另⼀个相似的⽅法对⽐,原因找出来了!不能使⽤SXSSFWorkbook读取excel数据,要⽤XSSFWorkbook读取数据!原来的代码是:File test = new File("D:\\test.xlsx");try {XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(test));SXSSFWorkbook workbook = new SXSSFWorkbook(wb);Sheet sheet = workbook.getSheetAt(0);for (int i = 0; i < 5; i++) {Row row = sheet.getRow(i);if(row==null){System.out.println(i+":null");}}} catch (Exception e) {e.printStackTrace();}最终控制台输出的结果为:将sheet对象的获取改为wb.getSheetAt(0)之后,就能正常获得row了。

File test = new File("D:\\test.xlsx");try {XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(test));// SXSSFWorkbook workbook = new SXSSFWorkbook(wb);Sheet sheet = wb.getSheetAt(0);for (int i = 0; i < 5; i++) {Row row = sheet.getRow(i);if(row==null){System.out.println(i+":null");}}} catch (Exception e) {e.printStackTrace();}View Code输出的结果为:我不知道为什么会出现这种情况,如果有知道的朋友,希望指导⼀下。

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;这三步来进⾏完成了。

java中使用POI解析Excel文件

java中使用POI解析Excel文件
for(int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++ ) {
if(workbook.getSheetAt(numSheets) != null) {
HSSFSheet aSheet = workbook.getSheetAt(numSheets);// 获得一个sheet
NumberFormat formater = NumberFormat.getInstance();
formater.setGroupingUsed(false);
if(cell != null) {
switch(cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
content.append(this.convertCell(cell)).append("\t"); //获得一个单元格的值
}
}
content.append("\n");
}
}
}
return content.toString();
cellValue = formater.format(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK:
cellValue = cell.getStringCellValue();
break;
if (workbook.getSheetAt(numSheets) != null) {
XSSFSheet aSheet = workbook.getSheetAt(numSheets);// 获得一个sheet

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组成。

Springboot之使用POI读取解析Excel文件

Springboot之使用POI读取解析Excel文件

Springboot之使⽤POI读取解析Excel⽂件1、引⼊依赖jar包。

在pom.xml中引⼊两个依赖的包即可:<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>RELEASE</version></dependency>2、读取xxx.xlsx@GetMapping(value = "/impPriceRecord")public InvokeResult impPriceRecord() throws Exception {try {List<AmoycarClue> infos = new ArrayList<AmoycarClue>();InputStream is = new FileInputStream("D:/xxx.xlsx");XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);XSSFRow titleCell = xssfSheet.getRow(0);for (int i = 1; i <= xssfSheet.getLastRowNum(); i++) {XSSFRow xssfRow = xssfSheet.getRow(i);int minCell = xssfRow.getFirstCellNum();int maxCell = xssfRow.getLastCellNum();XSSFCell bidCode = xssfRow.getCell(0);XSSFCell owerName = xssfRow.getCell(1);XSSFCell ownersex = xssfRow.getCell(2);XSSFCell owerMobile = xssfRow.getCell(3);XSSFCell basePrice = xssfRow.getCell(4);XSSFCell bidType = xssfRow.getCell(5);XSSFCell bidDealerId = xssfRow.getCell(6);XSSFCell bidDealerName = xssfRow.getCell(7);XSSFCell bidName = xssfRow.getCell(8);XSSFCell bidMobile = xssfRow.getCell(9);XSSFCell carNumber = xssfRow.getCell(10);XSSFCell autoNumber = xssfRow.getCell(11);XSSFCell carUnifiedNumber = xssfRow.getCell(12);XSSFCell curBid = xssfRow.getCell(13);XSSFCell bidStatus = xssfRow.getCell(14);XSSFCell maxBid = xssfRow.getCell(15);XSSFCell priceGap = xssfRow.getCell(16);XSSFCell bidCreateTime = xssfRow.getCell(17);XSSFCell expectPrice = xssfRow.getCell(18);XSSFCell roundStatus = xssfRow.getCell(19);AmoycarClue model = new AmoycarClue();model.setBidCode(getValue(bidCode));model.setBizoppCode("");model.setOriginalCode("");model.setWorkNo("");model.setOwnerName(getValue(owerName) + "");model.setOwnerSex(Double.valueOf(getValue(ownersex)).intValue());model.setOwnerMobile(getValue(owerMobile));model.setBasePrice(Double.valueOf(getValue(basePrice)));model.setBidName(getValue(bidName));model.setBidMobile(getValue(bidMobile));model.setBidType(Double.valueOf(getValue(bidType)).intValue());model.setCarCode(code);model.setMaxBid(Double.valueOf(getValue(maxBid)));model.setCurBid(Double.valueOf(getValue(curBid)));model.setPriceGap((Double.valueOf(getValue(priceGap))));model.setBidStatus(Double.valueOf(getValue(bidStatus)).intValue());SimpleDateFormat pat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");if (bidCreateTime!= null) {try {String sDate=getValue(bidCreateTime);java.util.Date uDate = pat.parse(sDate);model.setBidCreatetime(uDate);} catch (ParseException ex) {ex.printStackTrace();}}model.setRoundStatus(Double.valueOf(getValue(roundStatus)).intValue());model.setExpectPrice(Double.parseDouble(getValue(expectPrice)));model.setBidDealerId(getValue(bidDealerId));model.setBidDealerName(getValue(bidDealerName));try {auctionClient.syncAmoycarClue(model);Thread.sleep(1000);} catch (Exception ex) {ex.printStackTrace();return InvokeResult.failure(500, "impPriceRecord:插⼊错误BidCode:{" + model.getBidCode() +"}"+ ex.getMessage());}}return InvokeResult.success(true);} catch (Exception e) {return InvokeResult.failure(500,"impPriceRecord:历史数据导⼊错误"+e.getMessage());}}3、格式⽅法private String getValue(XSSFCell xssfRow) {if (xssfRow != null) {// if (xssfRow != null) {// xssfRow.setCellType(xssfRow.CELL_TYPE_STRING);// }if (xssfRow.getCellType() == xssfRow.CELL_TYPE_BOOLEAN) {return String.valueOf(xssfRow.getBooleanCellValue());} else if (xssfRow.getCellType() == xssfRow.CELL_TYPE_NUMERIC) {String result = "";if (xssfRow.getCellStyle().getDataFormat() == 22) {// 处理⾃定义⽇期格式:m⽉d⽇(通过判断单元格的格式id解决,id的值是58)SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");double value = xssfRow.getNumericCellValue();Date date = ermodel.DateUtil.getJavaDate(value);result = sdf.format(date);} else {double value = xssfRow.getNumericCellValue();CellStyle style = xssfRow.getCellStyle();DecimalFormat format = new DecimalFormat();String temp = style.getDataFormatString();// 单元格设置成常规if (temp.equals("General")) {format.applyPattern("#");}result = format.format(value);}return result;} else {return String.valueOf(xssfRow.getStringCellValue());}} elsereturn "0";}Java操作Excel中XSSFCell.CELL_TYPE_BOOLEAN、BOOLEAN、NUMERIC⽆定义解决⽅法错误原因:jar包版本更新,官⽅改动;解决⽅法:导⼊CellType包import ermodel.CellType使⽤CellType.BOOLEAN代替XSSFCell.CELL_TYPE_BOOLEAN使⽤CellType.NUMBERIC代替XSSFCell.CELL_TYPE_NUMBERIC。

poi 读取数据的正确方法

poi 读取数据的正确方法

poi 读取数据的正确方法POI是一个功能强大的Java库,可以用于读取、写入和操作Microsoft Office格式的文档,如Excel、Word和PowerPoint。

使用POI读取数据的正确方法如下:1. 导入POI库:首先,确保已经在项目中导入了POI库的jar文件。

你可以从Apache POI的官方网站上下载最新的POI库。

2. 创建工作簿:使用POI库的HSSFWorkbook类创建一个新的Excel工作簿对象。

工作簿是Excel文档的最高级别容器,可以包含多个工作表。

3. 打开工作表:使用工作簿对象的getSheet()方法打开特定的工作表。

在括号中传入工作表的名称或索引。

4. 读取单元格数据:使用工作表对象的getRow()和getCell()方法读取单元格中的数据。

getRow()方法根据行号获取行对象,getCell()方法根据列号或索引获取单元格对象。

使用单元格对象的getStringCellValue()、getNumericCellValue()或getDateCellValue()等方法获取特定类型的数据。

5. 遍历单元格数据:可以使用循环结构遍历工作表中所有单元格的数据。

首先使用工作表对象的getLastRowNum()方法获取最后一行的行号,然后使用getRow()和getCell()方法遍历每个单元格。

以下是一个简单的示例代码,演示如何使用POI读取Excel文件中的数据:```javaimport java.io.FileInputStream;import java.io.IOException;import ermodel.HSSFWorkbook;import ermodel.*;public class ExcelReader {public static void main(String[] args) {try {FileInputStream file = new FileInputStream("path/to/excel/file.xls"); Workbook workbook = new HSSFWorkbook(file);Sheet sheet = workbook.getSheet("Sheet1");// 遍历每一行和每一列,并读取数据for (Row row : sheet) {for (Cell cell : row) {if (cell.getCellType() == CellType.STRING) {System.out.print(cell.getStringCellValue() + "\t");} else if (cell.getCellType() == CellType.NUMERIC) {System.out.print(cell.getNumericCellValue() + "\t");} else if (cell.getCellType() == CellType.BOOLEAN) {System.out.print(cell.getBooleanCellValue() + "\t");}}System.out.println(); // 换行}workbook.close();file.close();} catch (IOException e) {e.printStackTrace();}}}```以上是使用POI读取数据的正确方法。

java poi excel 读写

java poi excel 读写

题目:探索Java中POI库的Excel读写功能1. 简介Java作为一种广泛应用的编程语言,拥有丰富的库和框架来支持各种应用场景。

其中,POI(Poor Obfuscation Implementation)库是Java操作Microsoft Office格式文件的重要工具之一。

在POI库中,Excel的读写功能一直备受开发者关注,因为Excel在商业和数据处理领域有着广泛的应用。

本文将深入探讨Java中POI库的Excel读写功能,介绍其基本用法和注意事项。

2. POI库的基本概念POI库是Apache软件基金会的一个开源项目,旨在提供Java程序对Microsoft Office格式文件的读写功能。

它支持对Excel、Word和PowerPoint等文件的操作,其中Excel的读写功能是开发者们最为关注的部分。

POI库主要由HSSF(Horrible Spreadsheet Format)、XSSF(XML Spreadsheet Format)和SXSSF(Streaming Usermodel API)三个子项目组成,在具体应用时,开发者可以根据自己的需求选择合适的子项目来实现对Excel文件的读写。

3. Excel的读操作在POI库中,读取Excel文件的操作主要通过HSSFWorkbook和XSSFWorkbook来实现。

HSSFWorkbook用于操作.xls格式的文件,而XSSFWorkbook用于操作.xlsx格式的文件。

使用POI库读取Excel文件的过程包括打开Excel文件、读取工作表、遍历行和列数据等步骤。

在具体的代码实现中,开发者可以根据需求选择不同的API来完成特定的读取任务,例如使用HSSF类库来从.xls文件中读取数据,或者使用XSSF类库来从.xlsx文件中读取数据。

在读取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)。

使用POI读取excel文件内容package edu.sjtu.erplab.poi;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;import java.io.InputStream;importjava.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;importermodel.HSSFCell;importermodel.HSSFDateUtil;importermodel.HSSFRow;importermodel.HSSFSheet;importermodel.HSSFWorkbook;importorg.apache.poi.poifs.filesystem.POIFSFileSystem;/** * 操作Excel表格的功能类*/public class ExcelReader { private POIFSFileSystem fs; private HSSFWorkbook wb;private HSSFSheet sheet; private HSSFRow row; /** * 读取Excel表格表头的内容* @param InputStream * @return String 表头内容的数组*/ public String[] readExcelTitle(InputStream is) { try { fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); } catch (IOException e){ e.printStackTrace(); } sheet = wb.getSheetAt(0); row = sheet.getRow(0); // 标题总列数int colNum =row.getPhysicalNumberOfCells();System.out.println("colNum:" + colNum); String[] title = new String[colNum]; for (int i = 0; i//title[i] = getStringCellValue(row.getCell((short) i));title[i] = getCellFormatValue(row.getCell((short) i)); } return title; } /** * 读取Excel数据内容* @param InputStream * @return Map 包含单元格数据内容的Map对象*/ public MapreadExcelContent(InputStream is) { Map content = new HashMap(); String str = ""; try{ fs = new POIFSFileSystem(is);wb = new HSSFWorkbook(fs); } catch (IOException e) { e.printStackTrace(); } sheet = wb.getSheetAt(0); // 得到总行数int rowNum = sheet.getLastRowNum(); row =sheet.getRow(0); int colNum =row.getPhysicalNumberOfCells(); // 正文内容应该从第二行开始,第一行为表头的标题for (int i = 1; irow = sheet.getRow(i); int j = 0;while (j // 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据// 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean // str += getStringCellValue(row.getCell((short) j)).trim() +// "-"; str +=getCellFormatValue(row.getCell((short) j)).trim() + " ";j++; } content.put(i, str);str = ""; } return content; } /*** 获取单元格数据内容为字符串类型的数据* * @param cell Excel单元格* @return String 单元格数据内容*/ private String getStringCellValue(HSSFCell cell) { String strCell = ""; switch(cell.getCellType()) { caseHSSFCell.CELL_TYPE_STRING: strCell = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: strCell = String.valueOf(cell.getNumericCellValue());break; case HSSFCell.CELL_TYPE_BOOLEAN: strCell = String.valueOf(cell.getBooleanCellValue()); break; case HSSFCell.CELL_TYPE_BLANK: strCell = ""; break; default:strCell = ""; break; } if (strCell.equals("") || strCell == null) { return ""; } if (cell == null) { return ""; } return strCell; } /** * 获取单元格数据内容为日期类型的数据* *@param cell * Excel单元格*@return String 单元格数据内容*/ private String getDateCellValue(HSSFCell cell) { String result = ""; try { int cellType = cell.getCellType();if (cellType == HSSFCell.CELL_TYPE_NUMERIC){ Date date = cell.getDateCellValue(); result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1) + "-" + date.getDate(); } else if (cellType == HSSFCell.CELL_TYPE_STRING) { String date = getStringCellValue(cell); result = date.replaceAll("[年月]", "-").replace("日","").trim(); } else if (cellType ==HSSFCell.CELL_TYPE_BLANK) { result = ""; } } catch (Exception e){ System.out.println("日期格式不正确!");e.printStackTrace(); } return result; }/** * 根据HSSFCell类型设置数据* @param cell* @return */ private StringgetCellFormatValue(HSSFCell cell) { String cellvalue = ""; if (cell != null) { // 判断当前Cell 的Type switch (cell.getCellType()){ // 如果当前Cell的Type为NUMERICcase HSSFCell.CELL_TYPE_NUMERIC: case HSSFCell.CELL_TYPE_FORMULA: { //判断当前的cell是否为Date if (HSSFDateUtil.isCellDateFormatted(cell)){ // 如果是Date类型则,转化为Data 格式//方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00//cellvalue = cell.getDateCellValue().toLocaleString();//方法2:这样子的data格式是不带带时分秒的:2011-10-12 Date date = cell.getDateCellValue();SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd");cellvalue =sdf.format(date); } // 如果是纯数字else{ // 取得当前Cell的数值cellvalue =String.valueOf(cell.getNumericCellValue()); } break; } // 如果当前Cell的Type为STRIN case HSSFCell.CELL_TYPE_STRING: // 取得当前的Cell字符串cellvalue = cell.getRichStringCellValue().getString();break; // 默认的Cell值default: cellvalue = " "; } } else{ cellvalue = ""; } return cellvalue; } public static void main(String[] args){ try { // 对读取Excel表格标题测试InputStream is = new FileInputStream("d:\\test2.xls"); ExcelReader excelReader = new ExcelReader();String[] title = excelReader.readExcelTitle(is);System.out.println("获得Excel表格的标题:");for (String s : title) { System.out.print(s + " "); } // 对读取Excel表格内容测试InputStream is2 = newFileInputStream("d:\\test2.xls"); Map map = excelReader.readExcelContent(is2);System.out.println("获得Excel表格的内容:");for (int i = 1; iSystem.out.println(map.get(i)); } } catch(FileNotFoundException e) { System.out.println("未找到指定路径的文件!");e.printStackTrace(); } }}。

相关文档
最新文档