在Java中读写Excel文件
用Java读写Excel文件

c32.setCellValue(100);
c41.setCellValue("Sam");
c42.setCellValue(100);
//设定最后一行的为计算总和的行
HSSFCell totalValue = row5.createCell((short)4);
headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
headerCell.setCellStyle(headerStyle);
//为表格的列创建显示类型
HSSFCellStyle columnHeaderStyle = workBook.createCellStyle();
if(cell1 != null){
System.out.println(cell1.getStringCellValue());
}
HSSFCell cell2 = row.getCell((short)4);
System.out.print("\t");
if(cell2 != null){
totalValue.setCellType(HSSFCell.CELL_TYPE_FORMULA);
totalValue.setCellFormula("SUM(E6:E9)");
//写文件。完成保存任务
FileOutputStream stream = new FileOutputStream("d:/book1.xls");
//创建表格行的数据内容
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 文件的内容,比如获取单元格的值、设置单元格的值等操作。
Java中读excel文件

使用POI开发EXCEl文档Microsoft 的office系列产品拥有大量的用户,Word,Excel也成为办公文件的首选。
在Java中,已经有很多对于Word,Excel的开源的解决方案,其中比较出色的是Apache的Jakata项目的POI子项目。
POI包括一系列的API,它们可以操作基于Mricrosoft OLE 2 compound Document Format 的各种格式文件,可以通过这些API在java中读写Excel、Word等文件。
POI是完全的Java Excel 和Java Word 解决方案。
从poi3.5开始就可以支持MS最新的docx,xsls格式的文档了,而现在poi3.6已经引入了对OOXML,OutLook,Visio,Publisher等诸多文件格式的支持。
Poi3.6中API包含HSSF,HWPF,XSSF,HSLF,HDGF,HPBF。
其中:HSSF—提供读写Microsoft Excel XLS格式档案的功能。
HWPF—提供读写Microsoft Word DOC格式档案的功能。
XSSF—提供读写Microsoft Excel XLSX格式档案的功能。
HSLF—提供读写Microsoft PowerPoint格式档案的功能。
HDGF—提供读写Microsoft Visio格式档案的功能。
HPBF—提供读写Microsoft Publisher格式档案的功能。
使用POI,导入Poi jar包后,还需要导入的jar包有:dom4j-1.6.1.jar,xmlbeans-2.3.0.jar。
下面是一个使用Poi读取Excel 2003 的例子:。
JAVA读取EXCEL_自动生成实体类

JAVA读取EXCEL_⾃动⽣成实体类代码实现PropertyAnno.javaimport ng.annotation.ElementType;import ng.annotation.Retention;import ng.annotation.RetentionPolicy;import ng.annotation.Target;@Target(ElementType.FIELD)//规定⽤于全局变量@Retention(RetentionPolicy.RUNTIME)//定义为运⾏时注解/*** excel读取所⽤注解* @author Administrator**/public @interface PropertyAnno {String value() default "";} AnnoCreator.javaimport ng.annotation.Annotation;import ng.reflect.Field;import java.util.Collections;import java.util.HashMap;import java.util.Map;/*** 注解解释⼯具类* @author Administrator**/public class AnnoCreator {/*** 注解解释⽅法* @return Map<属性名(String), 注解名(String)>*/public static Map<String, String> annoCreator(Class<?> clazz) {Map<String, String> map = Collections.synchronizedMap(new HashMap<>());for (Field field : clazz.getDeclaredFields()) {//获取属性上所有注解Annotation[] annotations = field.getAnnotations();//判断属性上是否存在注解if(annotations.length < 1) {continue;}//判断属性上是否存在需要注解if(annotations[0] instanceof PropertyAnno) {map.put(field.getName(), ((PropertyAnno)annotations[0]).value());}}return map;}} ReadExcelimport java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import ng.reflect.Field;import ng.reflect.ParameterizedType;import ng.reflect.Type;import java.text.DecimalFormat;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import ermodel.HSSFCell;import ermodel.HSSFWorkbook;import ermodel.Cell;import ermodel.Row;import ermodel.Sheet;import ermodel.Workbook;import ermodel.XSSFWorkbook;public class ReadExcel<T> {/*** 错误信息*/private String errorMsg;/*** 表格数据对象*/private Class<T> clazz;/*** 改写初始化⽅法,将对象传⼊T*/@SuppressWarnings("unchecked")public ReadExcel() {@SuppressWarnings("rawtypes")Class clazz = getClass();while (clazz != Object.class) {Type t = clazz.getGenericSuperclass();if (t instanceof ParameterizedType) {Type[] args = ((ParameterizedType) t).getActualTypeArguments();if (args[0] instanceof Class) {this.clazz = (Class<T>) args[0];break;}}clazz = clazz.getSuperclass();}}/*** 根据⽂件名读取Excel⽂件** @param filePath ⽂件完整路径* @return Map<表名(sheet名,String), 表中的属性(List<T>)>*/public Map<String, List<T>> read(String filePath) {Map<String, List<T>> map = null;InputStream is = null;try {// 验证⽂件是否正确if (!validateExcel(filePath)) {System.out.println(errorMsg);return null;}// 判断⽂件的类型,是2003还是2007boolean isExcel2003 = true;if (isExcel2007(filePath)) {isExcel2003 = false;}// 创建流进⾏读取File file = new File(filePath);is = new FileInputStream(file);// 根据版本选择创建Workbook的⽅式Workbook workbook = null;if (isExcel2003) {workbook = new HSSFWorkbook(is);} else {workbook = new XSSFWorkbook(is);}map = readExcel(workbook);} catch (Exception ex) {ex.printStackTrace();} finally {if (is != null) {try {// 关闭连接is.close();} catch (IOException e) {is = null;e.printStackTrace();}}}return map;}/*** 读取Excel表格*/@SuppressWarnings("deprecation")private Map<String, List<T>> readExcel(Workbook workbook) {Map<String, List<T>> map = Collections.synchronizedMap(new HashMap<>()); List<T> list = null;// 获取表格数量int numberOfSheets = workbook.getNumberOfSheets();for (int sheetNum = 0; sheetNum < numberOfSheets; sheetNum++) {list = new ArrayList<>();// 获取注解Map<String, String> creatorMap = AnnoCreator.annoCreator(clazz);// 获取指定的ExcelSheet sheet = workbook.getSheetAt(sheetNum);// 获取Excel的⾏数int totalRows = sheet.getPhysicalNumberOfRows();// Excel的列数int totalCells = 0;if (totalRows >= 1 && sheet.getRow(0) != null) {// 获取Excel的列数totalCells = sheet.getRow(0).getPhysicalNumberOfCells();}List<String> li = new ArrayList<>();// 循环Excel的⾏for (int r = 0; r < totalRows; r++) {// 获取对象T t = null;try {t = clazz.newInstance();} catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();}Row row = sheet.getRow(r);if (row == null) {continue;}// 遍历Excel的列for (int c = 0; c < totalCells; c++) {Cell cell = row.getCell(c);String cellValue = "";if (null != cell) {// 判断数据的类型switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_NUMERIC: // 数字DecimalFormat df = new DecimalFormat("0");cellValue = df.format(cell.getNumericCellValue());break;case HSSFCell.CELL_TYPE_STRING: // 字符串cellValue = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_BOOLEAN: // BooleancellValue = cell.getBooleanCellValue() + "";break;case HSSFCell.CELL_TYPE_FORMULA: // 公式cellValue = cell.getCellFormula() + "";break;case HSSFCell.CELL_TYPE_BLANK: // 空值cellValue = "";break;case HSSFCell.CELL_TYPE_ERROR: // 故障cellValue = "⾮法字符";break;default:cellValue = "未知类型";break;}}//此处可修改为⾃⼰的表格样式,例如打印第⼆⾏第⼆列的数据: /* if(r == 1 && c == 1){System.out.println(cellValue);} */if (r == 0) {// 存储第⼀⾏数据(列名)li.add(cellValue);} else {// 存储第⼀⾏后数据fill(creatorMap, li.get(c), cellValue, t);}}if (r != 0) {list.add(t);}}map.put(sheet.getSheetName(), list);}return map;}/*** 判断是否Excel格式是否为2003*/private static boolean isExcel2003(String filePath) {return filePath.matches("^.+\\.(?i)(xls)$");}/*** 判断是否Excel格式是否为2007*/private static boolean isExcel2007(String filePath) {return filePath.matches("^.+\\.(?i)(xlsx)$");}/*** 验证Excel⽂件*/private boolean validateExcel(String filePath) {// 检查⽂件名格式是否正确if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {System.out.println("⽂件名不是Excel格式");return false;}// 检查⽂件是否存在File file = new File(filePath);if (file == null || !file.exists()) {System.out.println("⽂件不存在");return false;}return true;}/*** 为对象进⾏赋值** @param map 注解map(注解=属性名)* @param str 当前读取到的列名* @param obj 当前读到的数据* @param t 需要进⾏赋值的对象*/private void fill(Map<String, String> map, String str, String obj, T t) {for (Entry<String, String> entry : map.entrySet()) {try {if (str.equals(entry.getValue())) {// 为对象进⾏赋值Field f = clazz.getDeclaredField(entry.getKey().trim());f.setAccessible(true);f.set(t, obj);return;}} catch (Exception e) {e.printStackTrace();}}}} BasicsEntity.java/*** excel内容实体类(⽰例)* 注意:实体类属性需定义为String类型* @author Administrator**/public class BasicsEntity {@PropertyAnno("列名")//被注解字段与excel中列名对应private String name;//字段名@PropertyAnno("类型")private String type;//字段类型@PropertyAnno("长度")private String length;//字段长度@PropertyAnno("⼩数点长度")private String decimal;//⼩数点长度@PropertyAnno("默认值")private String defaults;//默认值@PropertyAnno("备注")private String annotation;//备注@PropertyAnno("是否为⾮空(Y或N)")private String isNull;//是否为⾮空(Y或N)@PropertyAnno("是否为主键(Y或N)")private String isPrincipal;//是否为主键(Y或N)@PropertyAnno("是否启⽤主键⾃增(Y或N)")private String isProgressive;//是否启⽤主键⾃增(Y或N)@Overridepublic String toString() {return "BasicsEntity [name=" + name + ", type=" + type + ", length=" + length + ", decimal=" + decimal+ ", defaults=" + defaults + ", annotation=" + annotation + ", isNull=" + isNull + ", isPrincipal="+ isPrincipal + ", isProgressive=" + isProgressive + "]";}} ReadTest.javaimport java.util.List;import java.util.Map;import java.util.Map.Entry;import com.myutils.entity.BasicsEntity;/*** 测试类* @author Administrator*/public class ReadTest {public static void main(String[] args) {//调⽤⽅法时必须写成以下格式,否则反射⽆法获取到实体类ReadExcel<BasicsEntity> util = new ReadExcel<BasicsEntity>(){};//调⽤⽅法,返回实体类集合Map<String, List<BasicsEntity>> map = util.read("D:数据库⽂档\\测试表格.xlsx");for (Entry<String, List<BasicsEntity>> baMap : map.entrySet()) {System.out.println("表名:" + baMap.getKey().split("\\|")[0]);System.out.println("表备注:" + baMap.getKey().split("\\|")[1]);for (BasicsEntity basicsEntity : baMap.getValue()) {System.out.println(basicsEntity.toString());}}}}pom.xml⽂件<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion><groupId></groupId><artifactId>myExcel</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><dependencies><dependency><groupId>org.apache.directory.studio</groupId><artifactId>mons.codec</artifactId><version>1.8</version></dependency><dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId><version>2.6.12</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version></dependency></dependencies></project>测试使⽤表格:。
java读取excel科学计数法处理

java读取excel科学计数法处理摘要:一、前言- 介绍Java 读取Excel 文件时可能出现科学计数法的问题二、问题原因- 分析Java 读取Excel 文件时出现科学计数法的原因三、解决方法- 提出解决Java 读取Excel 文件时出现科学计数法的方法四、总结- 总结解决Java 读取Excel 文件时出现科学计数法的方法及其实际应用正文:一、前言在Java 编程中,读取Excel 文件是常见的操作。
但是,有时候读取出来的数据可能会是科学计数法表示,这对于后续的数据处理和分析带来了一定的麻烦。
因此,本文将探讨如何解决Java 读取Excel 文件时出现科学计数法的问题。
二、问题原因Java 读取Excel 文件时,如果单元格的类型是数值型,且该数值超出了Java 所能表示的范围(如:2^31 - 1),那么该数值将会以科学计数法的形式表示。
这是因为Java 在表示大数值时,会使用科学计数法。
而Excel 文件中的数值可能因为单元格设置、数据录入等原因,导致出现这种情况。
三、解决方法要解决Java 读取Excel 文件时出现科学计数法的问题,可以采用以下方法:1.使用Apache POI 库Apache POI 库是Java 读取Excel 文件的一个非常强大的库,支持xls 和xlsx 格式的文件。
使用Apache POI 库读取Excel 文件时,可以通过设置单元格的格式,来避免科学计数法的出现。
例如:```javaCell cell = row.getCell(j);if (cell != null) {cell.setCellType(CellType.STRING);cell.setCellValue(String.valueOf(cell.getNumericCellValue()));}```这段代码将单元格的类型设置为字符串类型,并将数值型的单元格值转换为字符串,从而避免了科学计数法的出现。
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,即总⾏数。
Java8让Excel的读写变得更加简单高效

Java8让Excel的读写变得更加简单⾼效Java8让Excel的读写变得更加简单⾼效在POI的使⽤过程中,对⼤多数API User来说经常⾯临两个问题,这也是GridExcel致⼒解决的问题。
问题1. 仅使⽤简单的导⼊导出功能,但每次业务的数据对象结构不同,需要重新编写处理⽅法,很⿇烦!解决⽅法将Excel处理逻辑抽取出来,封装成⼯具类。
封装条件与⼤多数Java API⼀样,POI把更多的精⼒放在⾼级功能的处理上,⽐如Formula(公式)、Conditional Formatting(条件格式)、Zoom(缩放)等。
对于仅仅做数据导⼊导出功能的API User,很少使⽤这些⾼级特性,这允许API⽤户对POI的使⽤进⾏简单的封装。
封装⽅式⽆论是读是写,我们都需要解决Excel中的Columns(列)与Java数据对象Fields(字段)的映射关系,将这种映射关系作为参数(Map对象HashMap或LinkedHashMap),传递给⼯具类。
对于Columns不难理解,它可以是有序的数字或字母,也可以是其它字符串⽤来作为⾸⾏,表⽰该列数据的含义。
对于Fields,它的处理需要兼容复杂情况,如下:查询字段时出现异常字段或单元格的值为null该列的值可能对应关联对象、甚⾄是关联集合中的某个字段值字段或单元格的值需要做特殊处理,例如value == true?完成:失败;反射⾸先想到,也是⼤多数封装者都在使⽤的⽅式是就是Reflection API,从上⽂章节我们了解到,反射重量级,会降低代码的性能,同时对复杂情况的处理⽀持性不够好。
反射+注解这种⽅式可以更好的⽀持复杂情况,但是反射依然会降低性能,同时注解对数据对象会造成代码侵⼊,⽽且对该⼯具类封装者的其他使⽤者⽆疑会增加学习成本。
匿名内部类这种⽅式也可以很好的⽀持复杂情况,但是使⽤匿名内部类的语法显然患有“垂直问题”(这意味着代码需要太多的线条来表达基本概念),太过冗杂。
easyexcel知识点

easyexcel知识点EasyExcel是一款基于Java的开源Excel操作工具,它提供了简单易用的API,使得开发人员能够快速、高效地进行Excel文件的读写、格式处理和数据操作。
本文将围绕EasyExcel的知识点展开,介绍其常用功能以及使用技巧。
一、Excel文件的读取与写入EasyExcel可以通过`read`方法读取Excel文件,并将内容映射到指定的Java对象中。
读取Excel文件的代码如下:```javaString fileName = "test.xlsx";List<DataModel> data = EasyExcel.read(fileName).sheet(0).doReadSync();```其中`DataModel`为自定义的Java对象,用于存储Excel中的数据。
通过`sheet`方法指定读取的工作表,通过`doReadSync`方法同步读取Excel文件。
写入Excel文件同样简单,只需将数据写入到Java对象中,然后调用`write`方法将数据写入Excel文件即可。
写入Excel文件的代码如下:```javaString fileName = "test.xlsx";List<DataModel> data = getData(); // 获取要写入Excel的数据EasyExcel.write(fileName,DataModel.class).sheet("Sheet1").doWrite(data);```二、Excel文件的格式处理EasyExcel提供了丰富的API,可以对Excel文件进行格式处理,如设置单元格样式、合并单元格、设置列宽等。
下面介绍几个常用的格式处理功能。
1. 设置单元格样式可以通过`TableStyle`类设置单元格的样式,如设置背景色、边框样式等。
读写Excel

* 功能:读Excel 文件
* 写Excel 文件
*/
package readexcel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
}
}
wb.write(fout);
fout.close();
}
catch (Exception e)
{
e.printStackTrace();
}
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
HSSFCell cell = row.createCell((short) 0);
cell.setCellValue("学号");
int k = sheet.getColumns();System.out.println("sheet.getColumns():"+k); //返回有多少列
int k1 = sheet.getRows();System.out.println("sheet.getRows():"+k1); //返回有多少行
import java.util.ArrayList;
import java.util.List;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
Java实现读取excel中的数据及图片

Java实现读取excel中的数据及图⽚⼀、背景需要完成excel数据的读取与落库⼆、实现Java读取excel数据:指定某⼀⾏,读取整列的数据/*如果是xls格式,使⽤HSSFWorkbook,HSSFSheet,HSSFRow来进⾏相关操作如果是xlsx格式,使⽤XSSFWorkbook,XSSFSheet,XSSFRow来进⾏相关操作,⽬前只⽀持xlsx*/public static HashMap readExcelData(String filename, Integer row, Integer column,Integer sheet) throws IOException {//⽤于存储Exce读取数据HashMap<Integer,String> hashMap=new HashMap();("开始读取excel数据");//读取excel数据File file = ResourceUtils.getFile(filename);InputStream inputStream = new FileInputStream(file);XSSFWorkbook xssfWorkbook=new XSSFWorkbook(inputStream);//获取sheet表格,及读取单元格内容XSSFSheet xssfSheet=xssfWorkbook.getSheetAt(sheet);//先将获取的单元格设置为String类型,下⾯使⽤getStringCellValue获取单元格内容Integer cellIndex = 0;while(cellIndex<=column){//第⼀列为空时直接,赋值为空if (xssfSheet.getRow(row)==null || xssfSheet.getRow(row).getCell(cellIndex)==null){hashMap.put(cellIndex,"");cellIndex++;continue;}xssfSheet.getRow(row).getCell(cellIndex).setCellType(CellType.STRING);String stringValue=xssfSheet.getRow(row).getCell(cellIndex).getStringCellValue();hashMap.put(cellIndex,stringValue);cellIndex++;}("readExcelData:{}",hashMap.toString());return hashMap;}Java读取excel图⽚:获取整个excel的图⽚,可以按照指定的⾏和列来定位读取图⽚/*** 获取Excel中的图⽚* @param xssfSheet* @return*/public static Map<String, XSSFPictureData> getPictures(XSSFSheet xssfSheet){Map<String,XSSFPictureData> map=new HashMap<>();List<XSSFShape> list=xssfSheet.getDrawingPatriarch().getShapes();for (XSSFShape shape:list){XSSFPicture picture = (XSSFPicture) shape;XSSFClientAnchor xssfClientAnchor=(XSSFClientAnchor) picture.getAnchor();XSSFPictureData pdata = picture.getPictureData();// ⾏号-列号String key = xssfClientAnchor.getRow1() + "-" + xssfClientAnchor.getCol1();("key数据:{}",key);map.put(key, pdata);}return map;}实际调⽤测试@Testpublic void test() throws IOException, UnirestException {String filename="classpath:file/org.xlsx";File file = ResourceUtils.getFile(filename);InputStream inputStream = new FileInputStream(file);XSSFWorkbook xssfWorkbook=new XSSFWorkbook(inputStream);Map<String, XSSFPictureData> map=getPictures(xssfWorkbook.getSheetAt(0)); String mapKey="3-15";//指定⾏和列XSSFPictureData xssfPictureData= map.get(mapKey);byte[] data =xssfPictureData.getData();FileOutputStream out = new FileOutputStream("/Users/test12.png");out.write(data);out.close();}}jar包版本<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency>。
javaexcel解析常见方法

一、介绍在日常工作中,我们经常会遇到需要处理Excel文件的情况。
而对于Java程序员来说,对Excel文件进行解析是一项常见的任务。
本文将介绍一些常见的JavaExcel解析方法,希望能够帮助大家更好地处理Excel文件。
二、使用POI库解析Excel1. POI库简介POI(Poor Obfuscation Implementation)是Apache软件基金会的开源项目,旨在提供Java程序操作Microsoft Office格式文件的功能。
在处理Excel文件时,可以使用POI库来完成读取、写入和修改Excel文件的操作。
2. 使用POI库解析Excel的基本步骤a. 创建一个输入流,将Excel文件加载到工作簿中。
b. 获取工作表,可以根据工作表的名称或索引来获取。
c. 遍历工作表,获取每一行的数据。
d. 遍历每一行,获取单元格的数值并进行相应的处理。
3. 代码示例```java// 读取Excel文件File file = new File("test.xlsx");FileInputStream fis = new FileInputStream(file); XSSFWorkbook workbook = new XSSFWorkbook(fis);// 获取工作表XSSFSheet sheet = workbook.getSheetAt(0);// 遍历工作表for (Row row : sheet) {// 遍历行for (Cell cell : row) {// 获取单元格的值String value = cell.getStringCellValue();// 进行相应的处理}}// 关闭流fis.close();```4. 注意事项使用POI库解析Excel时,需要注意处理空单元格、日期格式、数值类型等特殊情况,以确保解析的准确性。
三、使用EasyExcel库解析Excel1. EasyExcel库简介EasyExcel是阿里巴巴开源的一款针对大数据量Excel操作的Java库。
java 读取并保存excel中的图片件

java 读取并保存excel中的图片收藏/** 保存excel中的图片(以文件形式保存,或者存入数据库)** basePath:应用所在路径,附件存放路径:* 参数:is是上传的附件文件流*/public void saveSheetImgByFile(String basePath,InputStream is) throws ParseException { FileOutputStream os = null;try {Workbook wbk = Workbook.getWorkbook(is);//建文件目录File mkFile = new File(basePath);if (!mkFile.exists() && !mkFile.isDirectory()) {mkFile.mkdirs();}// 循环所有sheetfor (int k = 0; k < wbk.getNumberOfSheets(); k++) {Sheet sheet = wbk.getSheet(k);// 共有多少行int imgNumber = sheet.getNumberOfImages();// 获得sheet所包含的图片数// 循环sheet的所有图片for (int i = 0; i < imgNumber; i++) {Image image = sheet.getDrawing(i);byte[] imageData = image.getImageData();String fileName = image.getImageFile().getName().trim()+ ".jpg";File file = new File(basePath+"/" + fileName);os = new FileOutputStream(file);// 建立一个上传文件的输出流os.write(imageData, 0, imageData.length);// 将文件写入服务器}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (os != null) {os.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/** 将excel图片文件保存到数据库*/public void saveSheetImgByDB(InputStream is) throws ParseException,ClassNotFoundException, SQLException, IOException {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf8", "root", "root");String INSERT_PICTURE = "insert into t_mypicture(name, photo) values (?, ?)";PreparedStatement ps = null;FileOutputStream os = null;try {Workbook wbk = Workbook.getWorkbook(is);// 循环所有sheetfor (int k = 0; k < wbk.getNumberOfSheets(); k++) {Sheet sheet = wbk.getSheet(k);// 共有多少行int imgNumber = sheet.getNumberOfImages();// 获得sheet所包含的图片数// 循环sheet的所有图片for (int i = 0; i < imgNumber; i++) {Image image = sheet.getDrawing(i);byte[] imageData = image.getImageData();String fileName = image.getImageFile().getName().trim() + ".jpg";conn.setAutoCommit(false);ps = conn.prepareStatement(INSERT_PICTURE);ps.setString(1, fileName);ps.setBytes(2, imageData);ps.executeUpdate();mit();}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (os != null) {os.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}2.action方法调用:ImportExcelUtil ieu = new ImportExcelUtil();ExcelForm excelForm = (ExcelForm) form;FormFile file = excelForm.getExcelFile();// 附件方式保存String basePath = request.getSession().getServletContext().getRealPath( "/")+"excelFile";try {ieu.saveSheetImgByFile(basePath,file.getInputStream());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}// 数据库方式保存try {ieu.saveSheetImgByDB(file.getInputStream());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}引文来源java 读取并保存excel中的图片- LIUJIMMY的专栏- CSDN博客。
使用JXL读写Exceljxl读取excel代码

Workbook workBook = null;
try {
// 加载excel文件
fs = new FileInputStream(filePath);
// 得到 workbook
import java.util.ArrayList;
import java.util.List;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class ExcelImporter
} catch (WriteException e) {
System.out.println("jxl write WriteException: "+e.getMessage());
} catch (IOException e) {
System.out.println("jxl write file i/o exception!, cause by: "+e.getMessage());
import java.util.ArrayList;
import java.util.List;
import jxl.Workbook;
import bel;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import java.io.FileNotFoundException;
java读写excel文件

dateFormat = new WritableCellFormat(); //内容格式
menuTitleFormat=new WritableCellFormat();//标题格式
// 生成第一张表及设置表名
WritableSheet sheet = book.createSheet(sheetName, 0);
for (int i = 0; i < head.length; i++) {
Label label = new Label(i, 0, head[i],titleFormat);
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import cn.qtone.utteExcelFile {
* @throws RowsExceededException
*/
private static void writeData(WritableSheet sheet,String[] data,int row) throws RowsExceededException, WriteException{
}
}
return name;
}
//设置样式
private static void setSheetStyle(){
jxl.write.WritableFont titleFont = new jxl.write.WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.BOLD);//字体
java读取excel文件(.xls,xlsx,csv)

<groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency>
1,页面标签及属性
input[type="button"]{background-color: #71BCF3;color: white;}
int numday = (int) Math.round(str);
Calendar d = Calendar.getInstance(); d.set(1900, 0, 1); d.add(Calendar.DAY_OF_MONTH,numday);
int year = d.get(Calendar.YEAR); int month = d.get(Calendar.MONTH) + 1; int day = d.get(Calendar.DAY_OF_MONTH)-2;
String dateStr = year+"-"+month+"-"+day;
Date newDate = DateUtils.parse(dateStr);
System.out.println(DateUtils.format(newDate));
return newDate; } private static String getValue(HSSFCell hssfCell) {
InputStream inStream = upload.getInputStream();//文件流,可直接用 }
Java读写Excel文件DEMO

Java读写Excel⽂件DEMO下载⼀定格式的Excel⽂件: @RequestMapping("/xxxx/xxxx/xxxx/copyfiledownload")@ResponseBodypublic void copyfiledownload(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception{response.setContentType("text/html; charset=GBK");String basePath = request.getSession().getServletContext().getRealPath("/");File file = new File(basePath + "xxxx.xls");FileOutputStream fos=new FileOutputStream(file);HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet();wb.setSheetName(0, "sheet0");HSSFRow row=null;HSSFCell cell=null;row=sheet.createRow(0);cell=row.createCell(0);cell.setCellValue("xxID");cell=row.createCell(1);cell.setCellValue("每ID的总限量");cell=row.createCell(2);cell.setCellValue("每⽤户对此ID最⼤购买量");cell=row.createCell(3);cell.setCellValue("xx售卖价格");cell=row.createCell(4);cell.setCellValue("S时间");cell=row.createCell(5);cell.setCellValue("X时间");CellStyle cellStyle = wb.createCellStyle();CreationHelper helperDate = wb.getCreationHelper();cellStyle.setDataFormat(helperDate.createDataFormat().getFormat("yy/mm/dd/ hh:mm:ss"));HSSFRow rowD=null;HSSFCell cellD=null;for (int i = 1; i < 1000; i++) {rowD=sheet.createRow(i);cellD=rowD.createCell(4);cellD.setCellStyle(cellStyle);cellD=rowD.createCell(5);cellD.setCellStyle(cellStyle);} // 设置时间格式cell=row.createCell(6);cell.setCellValue("xx平台");//CellRangeAddressList(firstRow, lastRow, firstCol, lastCol)设置⾏列范围CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, 6, 6);String[] pos = {"PC","WAP","APP","PC+WAP","PC+APP","WAP+APP","PC+WAP+APP"};DataValidationHelper helper = sheet.getDataValidationHelper();DataValidationConstraint constraint = helper.createExplicitListConstraint(pos);DataValidation dataValidation = helper.createValidation(constraint, addressList);if(dataValidation instanceof XSSFDataValidation) {dataValidation.setSuppressDropDownArrow(true);dataValidation.setShowErrorBox(true);}else {dataValidation.setSuppressDropDownArrow(false);}sheet.addValidationData(dataValidation);wb.write(fos);fos.close();response.setContentType("application/x-msdownload");response.setContentLength((int) file.length());response.setHeader("Content-Disposition", "attachment;filename=" + new String(file.getName().getBytes("gbk"), "iso-8859-1")); FileInputStream fis = new FileInputStream(file);BufferedInputStream buff = new BufferedInputStream(fis);byte[] b = new byte[1024];long k = 0;OutputStream myout = response.getOutputStream();while (k < file.length()) {int j = buff.read(b, 0, 1024);k += j;myout.write(b, 0, j);}myout.flush();buff.close();fis.close();myout.close();file.delete();}Excel⽂件读取: /*** 读取excel表头** @param file* @return* @throws IOException*/@SuppressWarnings("unused")private String[] readExcelHead(File file) throws IOException {HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));HSSFSheet sheet = wb.getSheetAt(0);HSSFRow row = null;HSSFCell cell = null;row = sheet.getRow(0);String[] buff = new String[row.getLastCellNum()];for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {cell = row.getCell(i);buff[i] = cell.getStringCellValue();}return buff;} /*** 读取2003excel** @param file* @return*/private List<List<Object>> read2003Excel(File file) throws IOException {List<List<Object>> dataList = new ArrayList<List<Object>>();HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));HSSFSheet sheet = wb.getSheetAt(0);HSSFRow row = null;HSSFCell cell = null;Object val = null;DecimalFormat df = new DecimalFormat("0");// 格式化数字DecimalFormat df2 = new DecimalFormat("#0.00");// 格式化⼩数SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化⽇期字符串for (int i = sheet.getFirstRowNum() + 1; i < sheet.getPhysicalNumberOfRows(); i++) {row = sheet.getRow(i);if (row == null) {continue;}List<Object> objList = new ArrayList<Object>();for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {cell = row.getCell(j);if (cell == null) {val = null;objList.add(val);continue;}switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_STRING:val = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_NUMERIC:if ("@".equals(cell.getCellStyle().getDataFormatString())) {if (j == 3) {val = df2.format(cell.getNumericCellValue());} else {val = df.format(cell.getNumericCellValue());}} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {if (j == 3) {val = df2.format(cell.getNumericCellValue());} else {val = df.format(cell.getNumericCellValue());}} else {val = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));}break;case HSSFCell.CELL_TYPE_BOOLEAN:val = cell.getBooleanCellValue();break;case HSSFCell.CELL_TYPE_BLANK:val = "";break;default:val = cell.toString();break;}objList.add(val);}dataList.add(objList);}return dataList;} /*** 读取2007excel** @param file* @return*/private List<List<Object>> read2007Excel(File file) throws IOException {List<List<Object>> dataList = new ArrayList<List<Object>>();XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));XSSFSheet sheet = xwb.getSheetAt(0);XSSFRow row = null;XSSFCell cell = null;Object val = null;DecimalFormat df = new DecimalFormat("0");// 格式化数字DecimalFormat df2 = new DecimalFormat("#0.00");// 格式化⼩数SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化⽇期字符串for (int i = sheet.getFirstRowNum() + 1; i < sheet.getPhysicalNumberOfRows(); i++) {row = sheet.getRow(i);if (row == null) {continue;}List<Object> objList = new ArrayList<Object>();for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {cell = row.getCell(j);if (cell == null) {val = null;objList.add(val);continue;}switch (cell.getCellType()) {case XSSFCell.CELL_TYPE_STRING:val = cell.getStringCellValue();break;case XSSFCell.CELL_TYPE_NUMERIC:if ("@".equals(cell.getCellStyle().getDataFormatString())) {if (j == 3) {val = df2.format(cell.getNumericCellValue());} else {val = df.format(cell.getNumericCellValue());}} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {if (j == 3) {val = df2.format(cell.getNumericCellValue());} else {val = df.format(cell.getNumericCellValue());}} else {val = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));}break;case XSSFCell.CELL_TYPE_BOOLEAN:val = cell.getBooleanCellValue();break;case XSSFCell.CELL_TYPE_BLANK:val = "";break;default:val = cell.toString();break;}objList.add(val);}dataList.add(objList);}return dataList;}。
Java读写Excel文件中数据的简便方法(附代码)

Java读写Excel文件中数据的简便方法Java开发项目中经常会碰到处理Excel文件中数据的情况,这里通过一个例子来看一下实现方法:从Excel文件orders.xls中读取订单信息,从中找出2010年1月1日(含)之后,并且SELLERID等于18的订单。
找到的数据写入order_result.xls文件。
Excel文件orders.xls的内容如下:ORDERID CLIE NT SE LLERID AMOUNT ORDERDATE1 UJRNP 17 392 2008/11/2 15:282 SJCH 6 4802 2008/11/9 15:283 UJRNP 16 13500 2008/11/5 15:284 P WQ 9 26100 2008/11/8 15:285 P WQ 11 4410 2008/11/12 15:286 HANAR 18 6174 2008/11/7 15:287 E GU 2 17800 2008/11/6 15:288 VILJX 7 2156 2008/11/9 15:289 JAYB 14 17400 2008/11/12 15:2810 JAXE 19 19200 2008/11/12 15:2811 SJCH 7 13700 2008/11/10 15:2812 QUICK 11 21200 2008/11/13 15:2813 HL 12 21400 2008/11/21 15:2814 JAYB 1 7644 2008/11/16 15:2815 MIP 16 3234 2008/11/19 15:2816 AYW YN 4 6566 2008/11/21 15:28…Java程序的编写思路是1、从Excel文件逐行读入数据保存到List对象sourceList中。
2、遍历List对象sourceList,如果满足条件就保存到结果List对象resultList中。
Java读写excel实战完全解析

Java读写excel实战完全解析背景时值毕业季,很多毕业⽣初⼊职场。
因此,这边也写了⼀些新⼿相关的 Android 技术点。
⽐如上⼀篇的就是列举了⼀些⼩点,避免新⼿ Android 开发者踩坑。
同时,也是恰逢暑假,因此⼤学⽣处于放假阶段。
这⼀篇主要是来⾃⼀位⼤学⽣的提问。
因此这边分享⼀下我个⼈的解题思路和⽅法,希望能够对他有所启发。
欢迎⼤家交流分享。
题⽬使⽤语⾔:JAVA需求:读取⼀个Excel表格⾥⾯的数据(例如:姓名+分数),对其进⾏重新排序(按分数⾼低),然后输出在另⼀个Excel表格。
分析⼀般对需求我们都采取拆分思维。
将⼤问题拆成⼩问题,⼩问题解决了,整个⼤问题也就解决了。
这个需求很明确,需要解决三个问题: 1. 读取 Excel 表格数据 2. 对数据排序 3. 将数据写⼊另⼀个 Excel 表格我们这⾥要求使⽤ Java 语⾔,⽽ Java 语⾔⼀个很重要的点就是⾯向对象。
因此⾸先我们要考虑⼀下,这个题⽬⾥⾯有哪些类需要我们创建。
⼤概可以想象需要下⾯这些类:读取数据类:ExcelReader写⼊数据类:ExcelWriter数据排序类:由于 Java API ⾃带,所以不需要重复造轮⼦数据模型类:StudentScore启动类:ParserStart,带有 main ⽅法⼤概的 UML 图如下:此时我们可以写出 v0.1 代码:ExcelReader.java:import java.util.List;public class ExcelReader {public List<StudentScore> read(String fileName) {//TODOreturn null;}}ExcelWriter.java:import java.util.List;public class ExcelWriter {public void write(String fileName, List<StudentScore> list) {//TODO}}StudentScore.java:public class StudentScore {private String name;private int score;public StudentScore(String name, int score) {super(); = name;this.score = score;}public String getName() {return name;}public void setName(String name) { = name;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}}ParserStart.java:import java.util.List;public class ParserStart {public static void main(String[] args) {// 第⼀步:读取数据List<StudentScore> dataList = new ExcelReader().read("input.xls");// 第⼆步:排序//TODO// 第三部:写⼊数据new ExcelWriter().write("output.xls", dataList);}}好了,基本框架搭好了。
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文件时,开发者需要注意文件格式、数据类型和异常处理等问题,以确保读取的准确性和健壮性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在Java中读写Excel文件Jakarta的POI项目提供了一组操纵Windows文档的Java API,如下几个类提供了操作Excel文件的方便的途径:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell,分别代表了Excel电子表格中的Book、Sheet、行和单元格。
你可以在下面地址下载到最新的POI工具包:/poi/index.html下面的代码创建一个Excel文件test.xls,并在第一行的第一格中写入一条消息:1.import ermodel.*;2.import java.io.FileOutputStream;3.4.// code run against the jakarta-poi-1.5.0-FINAL-20020506.jar.5.public class PoiTest {6.7.static public void main(String[] args) throws Exception {8.FileOutputStream fos = new FileOutputStream("d:\test.xls");9. HSSFWorkbook wb = new HSSFWorkbook();10. HSSFSheet s = wb.createSheet();11. wb.setSheetName(0, "first sheet");12. HSSFRow row = s.createRow(0);13.HSSFCell cell = row.createCell(0);14.cell.setCellValue("Hello! This message is generated from POI.");15. wb.write(fos);16. fos.close();17. }18.19.}读取Excel文件时,首先生存一个POIFSFileSystem对象,由POIFSFileSystem 对象构造一个HSSFWorkbook,该HSSFWorkbook对象就代表了Excel文档。
下面代码读取上面生成的Excel文件写入的消息字串:1. POIFSFileSystem fs = null;2. HSSFWorkbook wb = null;3.4.try {5. fs = new POIFSFileSystem(new FileInputStream("d:\test.xls"));6. wb = new HSSFWorkbook(fs);7. } catch (IOException e) {8. e.printStackTrace();9. }10. HSSFSheet sheet = wb.getSheetAt(0);11. HSSFRow row = sheet.getRow(0);12. HSSFCell cell = row.getCell((short) 0);13.String msg = cell.getStringCellValue();一、Excel基础二、HSSF概况三、通过usermodel读取文件四、通过usermodel写入文件五、通过eventusermodel读取文件六、HSSF电子表格结构七、通过HPSF读取文档属性八、文档摘要信息九、附录━━━━━━正文:━━━━━━在上一篇文章中,我们介绍了POI项目的基本概念,了解了如何用POI来读写OLE 2复合文档结构,并给出了两个简单的例子:用POI来读写Excel文件的Workbook 流。
本文继续前文的话题,阐述如何用POI来读取/写入完整的Excel文件。
约定:POI项目2.0版现在已经接近正式发行阶段,开发进度迅速,不断有新的功能集成到原有的系统,同时也有对原有系统的修改。
为了保证本文的及时性,本文将按照最近的1.9开发版说明。
虽然编译最近的发行版源代码也能正常运行,但现在的代码和2.0的发行版会有一些出入。
一、Excel基础Microsoft Excel 97文件格式也被称为BIFF8,最近版本的Excel只对该格式作了少量的改动。
增加对新格式的支持除了增加项目的复杂性之外,唯一的效果也许只是不得不使每个用户升级代码,没有什么实际的好处。
因此,在下文说明中,凡是提到Excel 97格式的地方其实都是指Excel从97到XP的格式。
二、HSSF概况POI项目实现的Excel 97文件格式称为HSSF——也许你已经猜到,HSSF是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”(微软使某些原本简单的事情过分复杂,同时又过分简单地处理了某些原本需要灵活性的事情,让人不胜佩服!)也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。
通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
前面一篇文章提到了POIFS,那么HSSF和POIFS又有什么关系呢?就象其他POI的API一样,HSSF建立在POIFS的基础上,因此在HSSF内的有些代码和前文的某些代码很相似。
不过,当我们编写基于HSSF API的代码时,一般不需要了解POIFS API的细节。
HSSF为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。
前者很好理解,后者比较抽象,但操作效率要高得多。
usermodel主要有ermodel和org.apache.poi.hssf.eventusermodel包实现(在HSSF的早期版本中,org.apache.poi.hssf.eventusermodel属于eventmodel包)。
usermodel包把Excel文件映射成我们熟悉的结构,诸如Workbook、Sheet、Row、Cell等,它把整个结构以一组对象的形式保存在内存之中。
eventusermodel 要求用户熟悉文件格式的底层结构,它的操作风格类似于XML的SAX API和AWT的事件模型(这就是eventusermodel名称的起源),要掌握窍门才能用好。
另外,eventusermodel的API只提供读取文件的功能,也就是说不能用这个API来修改文件。
三、通过usermodel读取文件用HSSF的usermodel读取文件很简单。
首先创建一个InputStream,然后创建一个HSSFWorkbook:(如果你曾经在Excel中设置过日期格式,应该明白这是什么意思)。
因此,对于包含日期数据的单元格,cell.getCellType()将返回HSSFCell.CELL_TYPE_NUMERIC,不过利用工具函数HSSFDateUtil.isCellDateFormatted (cell)可以判断出单元格的值是否为日期。
isCellDateFormatted函数通过比较单元格的日期和Excel的内置日期格式得出结论——可以想象,按照这种判断方法,很多时候isCellDateFormatted函数会返回否定的结论,存在一定的误判可能。
本文附录包含了一个在Servlet环境中利用HSSF创建和返回Excel工作簿的实例。
四、通过usermodel写入文件写入XLS文件比读取XLS文件还要简单。
创建一个HSSFWorkbook实例,然后在适当的时候创建一个把文件写入磁盘的OutputStream,但延迟到处理结束时创建OutputStream也可以:要行,摘要行的数据必须是粗体、斜体,你可以创建一个summaryRowStyle样式对象,然后把这个样式指定给所有摘要行上的单元格。
注意,CellFormat和CellStyle对象是工作簿对象的成员,单元格对象只是引用它们。
一些,其中部分已被弃置不用,部分用于优化处理,但一般而言,HSSF可以转换它们)。
下面是一个注册事件处理句柄的例子:ROW…NUMBER RECORD (cell)LABELSST Record (cell)…}Sheet}}… images, macros, etc.Document SummarySummary七、通过HPSF读取文档属性在Microsoft Word、Excel、PowerPoint等软件中,用户可以通过“文件”→“属性”菜单给文档添加附加信息,包括文档的标题、主题、摘要、类别、关键词等,同时应用软件本身还会加入最后访问的用户、最后访问和修改/打印的日期时间等信息。
文档的属性和正文是分开保存的。
如前所述,OLE 2 CDF文件内部就象是一个容器,里面包含许多类似目录和文件的结构,而POIFS就是用来访问其中的文件的工具。
这些文件也称为流,文档的属性就保存在POIFS文件系统中专用的流里面。
以一个Word文档为例:虽然在资源管理器中你只看到一个叫做MyFile.doc的文档,其实在这个文档的内部,又包含了一个WordDocument、一个SummaryInformation和一个DocumentSummaryInformation文档;通常还会有其他的文档,这里暂且不管。
你能够猜出这些文档(流)分别包含什么内容吗?不错,WordDocument包含了你在Word里面编辑的文本,文档的属性保存在SummaryInformation和DocumentSummaryInformation流里面。
也许将所有属性保存在单个文档里面看起来太简单了,所以Microsoft决心要使用两个流,为了使事情更复杂一点,这两个流的名字前面还加上了八进制的\005字符——这是一个不可打印的字符,因此前面就把它省略了。
Microsoft定义的标准属性有一个好处,它们并不在乎主文档到底是什么类型——不管是Word文档、Excel工作簿还是PowerPoint幻灯。
只要你知道如何读取Excel文档的属性,就知道了如何读取其他文档的属性。
读取文档属性其实并不复杂,因为Java程序可以利用POI项目的HPSF包。
HPSF 是Horrible Property Set Format的缩写,译成中文就是“讨厌的属性集格式”。
HPSF 包是POI项目实现的读取属性工具,目前还不支持属性写入。
对于读取Microsoft定义的标准属性,通过HPSF提供的API可以很方便地办到;但如果要读取任意属性集就要用到更一般化的API,可以想象它要比读取标准属性的API复杂不少。
本文只介绍读取标准属性的简单API,因为对大多数应用程序来说这已经完全足够了。
下面就是一个读取OLE 2 CDF文档的标题(title)属性的Java程序:正如其名字所暗示的,PropertySetFactory是一个工厂类,它有一台“机器”能够把一个输入流转换成一个PropertySet实例,这台机器就是create ()方法。