Java Excel处理 - 草稿
- 使用python做数据分析的人知道,在python中,读取Excel比较方便。最简单的莫过于pandas的
read_excel()
方法了,而保存Excel也只需要pandas的to_excel()
。当遇到及其复杂,比如需要在Excel中使用图表、样式的时候,就会需要openpyxl这样的库。python中处理Execl的库还有很多,但这些库基本都有这样和那样的问题,功能也不是很强大。就比如openpyxl,如果你想用它来修改部分单元格的值和样式而不是一次性保存一整个Excel的话,它的运行数度将时相当慢的——有多慢?可能在某些情况下比你手动打开Excel修改还慢。并且就目前看来,python我所使用过的第三方库处理Excel中的公式对象、单元格样式,是很麻烦的事情,支持面也不是很广。- 使用java第三方office包POI处理Excel与python比起来,功能强大很多。但是写起来也比较麻烦,对于编程新手来说,入手难度略为大些。如果你只是想寻找一门语言简单处理一下数据,其实python已经够用,而且写起来也比较方便——毕竟“人生苦短,我用python”。但是如果你寻找的是比较深入、更加专业、强大的功能的话,那么还是推荐使用Java。
- 本文介绍了Java 的Office文档处理包POI中的三种类HSSF、XSSF、SXSSF。
- 它们提供了读取电子表格的方法,以创建,修改,读取和写入Excel电子表格。
POI提供了HSSF、XSSF以及SXSSF三种方式操作Excel。他们的区别如下:
类 | 特 性 |
HSSF | 是操作Excel97-2003版本,扩展名为.xls。 |
XSSF | 是操作Excel2007版本开始,扩展名为.xlsx。 |
SXSSF | 是在XSSF基础上,POI3.8版本开始提供的一种支持低内存占用的操作方式,扩展名为.xlsx。 |
其中:SXSSF是XSSF的API兼容流扩展,可用于必须生成非常大的电子表格且堆空间有限的情况。SXSSF通过限制对滑动窗口内的行的访问来实现其低内存占用,而XSSF允许对文档中的所有行进行访问。不再存在于窗口中的较旧的行由于被写入磁盘而变得不可访问。
实 例 目 录
- Excel读取
1.1xls
文件的读取
1.2.xlsx
文件的读取 - Excel操作
Java - Excel 实 例
注 意 |
本部分实例中使用到了第三方包,需要自行在`阿帕奇`官网相关页面下载。 然后按照正确的方式确保所需包能够被正常导入。请查看相关基础知识自行解决。 |
1. Excel读取
读取Excel概述
一般而言,读取excel需要:
- 1.定义Excel文件路径
- 2.读取Excel文件为流;
- 3.创建
工作簿对象
(Workbook);- 4.创建
工作表对象
(Sheet);- 5.解析Sheet中的行、列、单元格(Cell),获取、修改或对它们进行其它需要的操作;
- 6.存储。
其中:
工作簿(Workbook)
包含了很多个工作表,是工作表的集合。任何一个完好的Excel文件都可看成是一个工作簿,一个工作簿中可以存放一个或任意多个工作表;工作表(Sheet)
从属于工作簿,是工作簿的一部分。
1.1 读取Excel97-2003文件(后缀名.xls
)
我们读取的Excel文件打开的样子如图:
/** * 读取Excel 2003文件示范 * 李俊才 * 层层遍历,读取某个工作簿的多个工作表中校友范围内的所有单元格的值打印之 */ import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class Reader { private static HSSFWorkbook readFile(String filename) throws IOException { /** * 传入文件路径,先读取到输入流,再打开为HSSF工作簿对象返回 */ return new HSSFWorkbook(new FileInputStream(filename)); } public static void printExcel(String fileName) { try { HSSFWorkbook wb; HSSFSheet sheet; wb = readFile(fileName); int NumberOfSheets = wb.getNumberOfSheets(); System.out.println("\n[这个工作簿一共有"+NumberOfSheets+"个工作表]"); for(int k = 0; k < NumberOfSheets; ++k) { /** * 对于工作簿中的所有工作表 */ System.out.println("\n\n>>>>>>>>>>>>>>>>>>>正在读取第"+k+"个表>>>>>>>>>>>>>>>>>>>"); sheet = wb.getSheetAt(k); // 第 k 个工作表 int rows = sheet.getPhysicalNumberOfRows(); // 获取这个表中的总行数 System.out.println("->这个表的名字为:"+sheet.getSheetName()); System.out.println("->这个表有r="+rows+"行"); for(int r = 0; r < rows; ++r) { /** * 对于所有这个表的行号 */ HSSFRow row = sheet.getRow(r); // 从该表中获取这行的的对象 if (row != null) { // 对于其中的只要是非空行 int cells = row.getPhysicalNumberOfCells(); // 获取这一行的行数 System.out.println("\n>>第 " + row.getRowNum() + " 行一共有 " + cells + " 个单元格:"); // 打印XX行有XX个单元格 for(int c = 0; c < cells; ++c) { /** * 对于这行所有单元格编号 */ HSSFCell cell = row.getCell(c); // 从这行的对象row中获取该编号(列号)为c的单元格对象cell String value = null; switch(cell.getCellType()) // 依据该单元格的存储类型 { case 0: value = " [值]:" + cell.getNumericCellValue() + " [类型]:NUMERIC"; // 0:表示数值类型的值 break; case 1: value = " [值]:" + cell.getStringCellValue() + " [类型]:STRING"; // 1:表示字符串类型的值 break; case 2: value = " [值]:" + cell.getCellFormula() + " [类型]:FORMULA"; // 2: 表示公式类型的值 } String CellIndex = "("+r+", "+cell.getColumnIndex()+")"; System.out.println("[单元格索引]:"+CellIndex + value); // 打印单元格的列号和值 } } } } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String filename = "C:\\Users\\李俊才\\Desktop\\javaExcel\\temp.xls"; printExcel(filename); } }
Output[i]
[这个工作簿一共有2个工作表] >>>>>>>>>>>>>>>>>>>正在读取第0个表>>>>>>>>>>>>>>>>>>> ->这个表的名字为:Sheet1 ->这个表有r=8行 >>第 0 行一共有 5 个单元格: [单元格索引]:(0, 0) [值]:员工信息 [类型]:STRING [单元格索引]:(0, 1)null [单元格索引]:(0, 2)null [单元格索引]:(0, 3)null [单元格索引]:(0, 4)null >>第 1 行一共有 5 个单元格: [单元格索引]:(1, 0) [值]:编号 [类型]:STRING [单元格索引]:(1, 1) [值]:姓名 [类型]:STRING [单元格索引]:(1, 2) [值]:性别 [类型]:STRING [单元格索引]:(1, 3) [值]:年龄 [类型]:STRING [单元格索引]:(1, 4) [值]:收入 [类型]:STRING >>第 2 行一共有 5 个单元格: [单元格索引]:(2, 0) [值]:1.0 [类型]:NUMERIC [单元格索引]:(2, 1) [值]:张三 [类型]:STRING [单元格索引]:(2, 2) [值]:男 [类型]:STRING [单元格索引]:(2, 3) [值]:31.0 [类型]:NUMERIC [单元格索引]:(2, 4) [值]:12476.0 [类型]:NUMERIC >>第 3 行一共有 5 个单元格: [单元格索引]:(3, 0) [值]:2.0 [类型]:NUMERIC [单元格索引]:(3, 1) [值]:李四 [类型]:STRING [单元格索引]:(3, 2) [值]:女 [类型]:STRING [单元格索引]:(3, 3) [值]:29.0 [类型]:NUMERIC [单元格索引]:(3, 4) [值]:5555.0 [类型]:NUMERIC >>第 4 行一共有 5 个单元格: [单元格索引]:(4, 0) [值]:3.0 [类型]:NUMERIC [单元格索引]:(4, 1) [值]:孙五 [类型]:STRING [单元格索引]:(4, 2) [值]:男 [类型]:STRING [单元格索引]:(4, 3) [值]:46.0 [类型]:NUMERIC [单元格索引]:(4, 4) [值]:31067.0 [类型]:NUMERIC >>第 5 行一共有 5 个单元格: [单元格索引]:(5, 0) [值]:4.0 [类型]:NUMERIC [单元格索引]:(5, 1) [值]:赵六 [类型]:STRING [单元格索引]:(5, 2) [值]:女 [类型]:STRING [单元格索引]:(5, 3) [值]:27.0 [类型]:NUMERIC [单元格索引]:(5, 4) [值]:9999.0 [类型]:NUMERIC >>第 6 行一共有 5 个单元格: [单元格索引]:(6, 0) [值]:5.0 [类型]:NUMERIC [单元格索引]:(6, 1) [值]:钱七 [类型]:STRING [单元格索引]:(6, 2) [值]:男 [类型]:STRING [单元格索引]:(6, 3) [值]:59.0 [类型]:NUMERIC [单元格索引]:(6, 4) [值]:36791.0 [类型]:NUMERIC >>第 7 行一共有 5 个单元格: [单元格索引]:(7, 0) [值]:6.0 [类型]:NUMERIC [单元格索引]:(7, 1) [值]:王八 [类型]:STRING [单元格索引]:(7, 2) [值]:女 [类型]:STRING [单元格索引]:(7, 3) [值]:26.0 [类型]:NUMERIC [单元格索引]:(7, 4) [值]:8888.0 [类型]:NUMERIC >>>>>>>>>>>>>>>>>>>正在读取第1个表>>>>>>>>>>>>>>>>>>> ->这个表的名字为:Sheet2 ->这个表有r=8行 >>第 0 行一共有 8 个单元格: [单元格索引]:(0, 0) [值]:员工考勤表 [类型]:STRING [单元格索引]:(0, 1)null [单元格索引]:(0, 2)null [单元格索引]:(0, 3)null [单元格索引]:(0, 4)null [单元格索引]:(0, 5)null [单元格索引]:(0, 6)null [单元格索引]:(0, 7)null >>第 1 行一共有 8 个单元格: [单元格索引]:(1, 0) [值]:员工\日期 [类型]:STRING [单元格索引]:(1, 1) [值]:43983.0 [类型]:NUMERIC [单元格索引]:(1, 2) [值]:43984.0 [类型]:NUMERIC [单元格索引]:(1, 3) [值]:43985.0 [类型]:NUMERIC [单元格索引]:(1, 4) [值]:43986.0 [类型]:NUMERIC [单元格索引]:(1, 5) [值]:43987.0 [类型]:NUMERIC [单元格索引]:(1, 6) [值]:43988.0 [类型]:NUMERIC [单元格索引]:(1, 7) [值]:43989.0 [类型]:NUMERIC >>第 2 行一共有 8 个单元格: [单元格索引]:(2, 0) [值]:张三 [类型]:STRING [单元格索引]:(2, 1) [值]:Y [类型]:STRING [单元格索引]:(2, 2) [值]:Y [类型]:STRING [单元格索引]:(2, 3) [值]:Y [类型]:STRING [单元格索引]:(2, 4) [值]:Y [类型]:STRING [单元格索引]:(2, 5) [值]:Y [类型]:STRING [单元格索引]:(2, 6) [值]:Y [类型]:STRING [单元格索引]:(2, 7) [值]:Y [类型]:STRING >>第 3 行一共有 8 个单元格: [单元格索引]:(3, 0) [值]:李四 [类型]:STRING [单元格索引]:(3, 1) [值]:Y [类型]:STRING [单元格索引]:(3, 2) [值]:N [类型]:STRING [单元格索引]:(3, 3) [值]:Y [类型]:STRING [单元格索引]:(3, 4) [值]:N [类型]:STRING [单元格索引]:(3, 5) [值]:Y [类型]:STRING [单元格索引]:(3, 6) [值]:Y [类型]:STRING [单元格索引]:(3, 7) [值]:N [类型]:STRING >>第 4 行一共有 8 个单元格: [单元格索引]:(4, 0) [值]:孙五 [类型]:STRING [单元格索引]:(4, 1) [值]:Y [类型]:STRING [单元格索引]:(4, 2) [值]:Y [类型]:STRING [单元格索引]:(4, 3) [值]:N [类型]:STRING [单元格索引]:(4, 4) [值]:Y [类型]:STRING [单元格索引]:(4, 5) [值]:Y [类型]:STRING [单元格索引]:(4, 6) [值]:Y [类型]:STRING [单元格索引]:(4, 7) [值]:Y [类型]:STRING >>第 5 行一共有 8 个单元格: [单元格索引]:(5, 0) [值]:赵六 [类型]:STRING [单元格索引]:(5, 1) [值]:Y [类型]:STRING [单元格索引]:(5, 2) [值]:Y [类型]:STRING [单元格索引]:(5, 3) [值]:Y [类型]:STRING [单元格索引]:(5, 4) [值]:Y [类型]:STRING [单元格索引]:(5, 5) [值]:N [类型]:STRING [单元格索引]:(5, 6) [值]:Y [类型]:STRING [单元格索引]:(5, 7) [值]:Y [类型]:STRING >>第 6 行一共有 8 个单元格: [单元格索引]:(6, 0) [值]:钱七 [类型]:STRING [单元格索引]:(6, 1) [值]:Y [类型]:STRING [单元格索引]:(6, 2) [值]:Y [类型]:STRING [单元格索引]:(6, 3) [值]:Y [类型]:STRING [单元格索引]:(6, 4) [值]:Y [类型]:STRING [单元格索引]:(6, 5) [值]:Y [类型]:STRING [单元格索引]:(6, 6) [值]:Y [类型]:STRING [单元格索引]:(6, 7) [值]:Y [类型]:STRING >>第 7 行一共有 8 个单元格: [单元格索引]:(7, 0) [值]:王八 [类型]:STRING [单元格索引]:(7, 1) [值]:Y [类型]:STRING [单元格索引]:(7, 2) [值]:Y [类型]:STRING [单元格索引]:(7, 3) [值]:N [类型]:STRING [单元格索引]:(7, 4) [值]:Y [类型]:STRING [单元格索引]:(7, 5) [值]:N [类型]:STRING [单元格索引]:(7, 6) [值]:Y [类型]:STRING [单元格索引]:(7, 7) [值]:Y [类型]:STRING
`
1.2 读取Excel2007+文件(后缀名.xlsx
)
实现1.1节中的功能时,使用XSSF读取Excel2007+文件与使用HSSF读取Excel2003文件方法基本类似。只是导入的包名都从
HSSF
成了XSSF
。请参考1.1节以及手册参考之。
2. 操作Excel
2.1
常 用 方 法 查 询 手 册 目 录
HSSFWorkbook类
HSSFSheet类
HSSFRow类
HSSFCell类
XSSFWorkbook类
XSSFSheet类
XSSFRow类
XSSFCell类
Part1 - HSSF(Excel2003)
1.1 HSSFWorkbook
import org.apache.poi.xssf.usermodel.HSSFWorkbook;
1.2 HSSFSheet
import org.apache.poi.xssf.usermodel.HSSFSheet;
1.3 HSSFRow
import org.apache.poi.xssf.usermodel.HSSFRow;
1.4 HSSFCell
import org.apache.poi.xssf.usermodel.HSSFCell;
Part2 - XSSF(Excel2007+)
2.1 XSSFWorkbook
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
构造器
构造器 | 描述 |
XSSFWorkbook() | 创建一个新的电子表格工作簿( SpreadsheetML workbook)。 |
XSSFWorkbook(java.io.File file) | 从给定的文件构造一个XSfWorkObject。 |
XSSFWorkbook(java.io.InputStream is) | 通过将整个流缓冲到内存中,然后为它打开一个OPCPackage对象,构造一个XSfWorkObject。 |
XSSFWorkbook(OPCPackage pkg) | 给定一个OpenXML4J包对象,构造一个XSSFWorkbook对象,请参见 http://poi.apache.org/oxml4j/. |
XSSFWorkbook(PackagePart part) | 使用包部件构造XSSFWorkbook对象。 |
XSSFWorkbook(java.lang.String path) | 给定一个文件名,构造一个XSSFWorkbook对象。 |
XSSFWorkbook(XSSFFactory factory) | |
XSSFWorkbook(XSSFWorkbookType workbookType) | 创建一个新的电子表格工作簿( SpreadsheetML workbook)。 |
方法
方法 | 描述 | 修饰符和类型 |
addOlePackage(byte[] oleData, java.lang.String label, java.lang.String fileName, java.lang.String command) | 将具有给定内容的OLE包管理器对象添加到工作表中 向工作簿添加图片 | int |
addPicture(byte[] pictureData, int format) | 向工作簿添加图片 | int |
addPicture(java.io.InputStream is, int format) | 向工作簿添加图片 | int |
addPivotCache(java.lang.String rId) | 将数据透视缓存(pivotCache)添加到工作簿 | protected org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCache |
addToolPack(UDFFinder toopack) | 在此工作簿中注册新的工具包 | void |
beforeDocumentRead() | protected void | |
cloneSheet(int sheetNum) | 从XSSFWorkbook中的现有工作表创建XSSFSheet | XSSFSheet |
cloneSheet(int sheetNum, java.lang.String newName) | 从XSSFWorkbook中的现有工作表创建XSSFSheet | XSSFSheet |
close() | 关闭读取本文档的基础OPCPackage(如果有) | void |
commit() | 将内容保存在基础包部分中。 | protected void |
createCellStyle() | 创建新的XSSFCellStyle,并将其添加到工作簿的样式表中 | XSSFCellStyle |
createDataFormat() | 返回工作簿的数据格式表(创建数据格式字符串的工厂)。 | XSSFDataFormat |
createDialogsheet(java.lang.String sheetname, org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDialogsheet dialogsheet) | protected XSSFDialogsheet | |
createFont() | 创建新字体,并将其添加到工作簿的字体表中 | XSSFFont |
createName() | 在此工作簿中创建新的(未初始化的)已定义名称 | XSSFName |
createSheet() | 为此工作簿创建一个XSSFSheet,将其添加到工作表中,并返回高级表示 | XSSFSheet |
createSheet(java.lang.String sheetname) | 为此工作簿创建新工作表,并返回高级表示 | XSSFSheet |
findFont(boolean bold, short color, short fontHeight, java.lang.String name, boolean italic, boolean strikeout, short typeOffset, byte underline) | 查找与提供的属性相匹配的字体 | XSSFFont |
getActiveSheetIndex() | 获取活动工作表的简便方法 | int |
getAllEmbeddedParts() | 获取文档的嵌入文件 | java.util.List |
getAllNames() | 获取工作簿中所有命名区域的列表。 | java.util.List |
getAllPictures() | 从工作簿中获取所有图片。 | java.util.List |
getCalculationChain() | 返回此工作簿的CalculationChain对象 | CalculationChain |
getCellFormulaValidation() | 对CellBase.setCellFormula(String)的调用是否会验证公式。 | boolean |
getCellStyleAt(int idx) | 获取给定索引处的单元格样式对象 | XSSFCellStyle |
getCreationHelper() | 返回一个对象,该对象处理XSF各种实例的具体类的实例化 | XSSFCreationHelper |
getCTWorkbook() | 返回底层的XML bean | org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook |
getCustomXMLMappings() | java.util.Collection | |
getExternalLinksTable() | 返回此工作簿的外部链接表(ExternalLinks)对象列表 | java.util.List |
getFirstVisibleTab() | 获取excel中tab列表中显示的第一个tab | int |
getFontAt(int idx) | 获取给定索引号处的字体 | XSSFFont |
getFontAt(short idx) | 获取给定索引号处的字体 | XSSFFont |
getForceFormulaRecalculation() | 打开工作簿时是否要求Excel重新计算所有公式 | boolean |
getMapInfo() | MapInfo | |
getMissingCellPolicy() | 从行中获取缺失或空白单元格时,检索当前的策略 | Row.MissingCellPolicy |
getName(java.lang.String name) | 获取具有给定名称的第一个命名范围 | XSSFName |
getNames(java.lang.String name) | 获取具有给定名称的命名范围 | java.util.List |
getNumberOfFonts() | 获取字体表中的字体数量 | short |
getNumberOfFontsAsInt() | 获取字体表中的字体数量 | int |
getNumberOfNames() | 获取此工作簿中命名区域的数量 | int |
getNumberOfSheets() | 获取此工作簿中工作表的数量 | int |
getNumCellStyles() | 获取工作簿包含的样式数量 | int |
getPivotTables() | java.util.List | |
getPrintArea(int sheetIndex) | 检索指定工作表的打印区域的引用,即使没有指定,工作表名称也会追加到引用中。 | java.lang.String |
getSharedStringSource() | 返回此工作簿的共享字符串缓存 | SharedStringsTable |
getSheet(java.lang.String name) | Get sheet with the given name (case insensitive match) | XSSFSheet |
getSheetAt(int index) | Get the XSSFSheet object at the given index. | XSSFSheet |
getSheetIndex(Sheet sheet) | Returns the index of the given sheet | int |
getSheetIndex(java.lang.String name) | 按名称返回工作表的索引(不区分大小写) | int |
getSheetName(int sheetIx) | 获取工作表名称 | java.lang.String |
getSheetVisibility(int sheetIx) | 获取此工作簿中工作表的可见性(visible, hidden, very hidden) | SheetVisibility |
getSpreadsheetVersion() | 返回此工作簿的电子表格的(excel2007)版本 | SpreadsheetVersion |
getStylesSource() | 返回一个表示用于内容样式化的共享对象集合的对象 | StylesTable |
getTable(java.lang.String name) | 返回给定名称的数据表(不区分大小写)。 | XSSFTable |
getTheme() | 返回当前工作簿的主题 | ThemesTable |
getWorkbookType() | XSSFWorkbookType | |
isDate1904() | 获取一个布尔值,该值指示工作簿中使用的日期系统是否从1904年开始 | boolean |
isHidden() | boolean | |
isMacroEnabled() | 我们是正常的workbook (.xlsx), 或一个启用宏的工作簿(.xlsm)? | boolean |
isRevisionLocked() | 指定一个布尔值,该值指示工作簿是否因修订而被锁定 | boolean |
isSheetHidden(int sheetIx) | 检查工作表是否隐藏(hidden) | boolean |
isSheetVeryHidden(int sheetIx) | 检查工作表是否高度隐蔽(very hidden) | boolean |
isStructureLocked() | 指定一个布尔值,该值指示工作簿的结构是否被锁定 | boolean |
isWindowsLocked() | 指定一个布尔值,该值指示组成工作簿的窗口是否被锁定 | boolean |
iterator() | 允许foreach循环的sheetIterator()的别名注意:此迭代器不支持remove() | java.util.Iterator |
linkExternalWorkbook(java.lang.String name, Workbook workbook) | 添加允许引用指定外部工作簿的公式添加到此工作簿所需的外部链接表部分和关系。 | int |
lockRevision() | 锁定工作簿以进行修订 | void |
lockStructure() | 锁定工作簿的结构 | void |
lockWindows() | 锁定构成工作簿的窗口 | void |
newPackage(XSSFWorkbookType workbookType) | 创建一个新的SpreadsheetML包,并设置默认的最小内容 | protected static OPCPackage |
onDeleteFormula(XSSFCell cell) | 从该工作簿中删除公式时引发,例如调用单元格时。设置单元格公式(空) | protected void |
onDocumentRead() | 读取包部分时触发 | protected void |
parseSheet(java.util.Map<java.lang.String,XSSFSheet> shIdMap, org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet ctSheet) | 通常不会被外部调用,但可能会被覆盖以避免基于DOM的大型表单解析 | void |
removeName(Name name) | 由于removeName(String)不一定唯一 (name + sheet 索引唯一), 这个方法比较准确. | void |
removePrintArea(int sheetIndex) | 删除指定sheet的打印区域 | void |
removeSheetAt(int index) | 按照给定的索引值删除sheet | void |
setActiveSheet(int index) | 设置活动工作表的简便方法 | void |
setCellFormulaValidation(boolean value) | 每当调用 CellBase.setCellFormula(String) 时将验证公式 | void |
setFirstVisibleTab(int index) | 设置excel中选项卡列表中显示的第一个选项卡 | void |
setForceFormulaRecalculation(boolean value) | 打开工作簿时,应用程序是否应执行完全重新计算 | void |
setHidden(boolean hiddenFlag) | void | |
setMissingCellPolicy(Row.MissingCellPolicy missingCellPolicy) | 设置从行中获取缺失或空白单元格时的策略 | void |
setPivotTables(java.util.List pivotTables) | protected void | |
setPrintArea(int sheetIndex, int startColumn, int endColumn, int startRow, int endRow) | 为了方便Java程序员维护指针 | void |
setPrintArea(int sheetIndex, java.lang.String reference) | 为提供的工作表设置打印区域 | void |
setRevisionsPassword(java.lang.String password, HashAlgorithm hashAlgo) | 设置修订密码 | void |
setSelectedTab(int index) | 我们只选择了一张工作表(sheet)与HSSF兼容。 | void |
setSheetHidden(int sheetIx, boolean hidden) | 隐藏或取消隐藏工作表。 | void |
setSheetName(int sheetIndex, java.lang.String sheetname) | 设置工作表名称。 | void |
setSheetOrder(java.lang.String sheetname, int pos) | 设置给定工作表的外观顺序。 | void |
setSheetVisibility(int sheetIx, SheetVisibility visibility) | 隐藏或取消隐藏工作表。 | void |
setVBAProject(java.io.InputStream vbaProjectStream) | 向工作簿添加vbaProject.bin文件 | void |
setVBAProject(XSSFWorkbook macroWorkbook) | 将从另一个给定工作簿中获取的vbaProject.bin文件添加到此工作簿中 | void |
setWorkbookPassword(java.lang.String password, HashAlgorithm hashAlgo) | 设置工作簿密码 | void |
setWorkbookType(XSSFWorkbookType type) | 设置工作簿是否为一个 .xlsx 或者 .xlsm (启用宏的)文件 | void |
sheetIterator() | 按工作表顺序返回工作簿中工作表的迭代器 | java.util.Iterator |
unLock() | 删除工作簿保护设置 | void |
unLockRevision() | 解锁工作簿以进行修订 | void |
unLockStructure() | 解锁工作簿的结构 | void |
unLockWindows() | 解锁组成工作簿的窗口 | void |
validateRevisionsPassword(java.lang.String password) | 根据存储的哈希验证密码,哈希方法将由现有的密码属性决定 | boolean |
validateWorkbookPassword(java.lang.String password) | 根据存储的哈希验证密码,哈希方法将由现有的密码属性决定 | boolean |
2.2 XSSFSheet
import org.apache.poi.xssf.usermodel.XSSFSheet;
构造器
方法 | 描述 | 修饰符和类型 |
XSSFChartSheet PackagePart part) |
protected |
2.3 XSSFRow
import org.apache.poi.xssf.usermodel.XSSFRow;
2.4 XSSFCell
电子表格行中单元格的高级表示形式
import org.apache.poi.xssf.usermodel.XSSFCell;
XSSFCell类 - 方 法 目 录
方法 | 修饰符和类型 | 方法和说明 |
getAddress() | CellAddress |
getAddress() 获取此单元格的Excel地址,如 A1 |
CellRangeAddress() | CellRangeAddress |
getArrayFormulaRange() 仅对数组公式单元格有效 |
getBooleanCellValue() | boolean |
getBooleanCellValue() 以布尔值形式获取单元格的值。 |
getCachedFormulaResultType() | CellType |
getCachedFormulaResultType() 仅对公式单元格有效 |
getCellComment() | Comment |
getCellComment() 返回与此单元格关联的注释 |
getCellFormula() | java.lang.String |
getCellFormula() 返回单元格的公式,例如, SUM(C4:E4) |
getCellStyle() | CellStyle |
getCellStyle() 返回单元格的样式。 |
getCellType() | CellType |
getCellType() 返回单元格类型。 |
getColumnIndex() | int |
getColumnIndex() 返回此单元格的列索引 |
getDateCellValue() | java.util.Date |
getDateCellValue() 获取单元格的值作为日期。 |
getErrorCellValue() | byte |
getErrorCellValue() 获取单元格的值作为错误代码。 |
getHyperlink() | Hyperlink |
getHyperlink() |
getLocalDateTimeCellValue() | java.time.LocalDateTime |
getLocalDateTimeCellValue() 获取单元格的值作为LocalDateTime。 |
getNumericCellValue() | double |
getNumericCellValue() 以数字形式获取单元格的值。 |
getRichStringCellValue() | RichTextString |
getRichStringCellValue() 以XSSFRichTextString形式获取单元格的值 |
getRow() | Row |
getRow() 返回此单元格所属的行 |
getRowIndex(getRowIndex) | int |
getRowIndex() 返回包含该单元格的工作表中一行的行索引 |
getSheet() | Sheet |
getSheet() 返回此单元格所属的工作表 |
getStringCellValue() | java.lang.String |
getStringCellValue() 以字符串形式获取单元格的值 |
isPartOfArrayFormulaGroup() | boolean |
isPartOfArrayFormulaGroup() |
removeCellComment() | void |
removeCellComment() 删除对此单元格的注释(如果有的话)。 |
removeFormula() | void |
removeFormula() 删除公式(如果有)。 |
removeHyperlink() | void |
removeHyperlink() 删除此单元格的超链接(如果有)。 |
setAsActiveCell() | void |
setAsActiveCell() 将此单元格设置为工作表的活动单元格 |
setBlank() | void |
setBlank() 从单元格中删除公式和值,并将其类型设置为CellType.BLANK 。 |
setCellComment(Comment comment) | void |
setCellComment(Comment comment) 给该单元格分配评论 |
setCellErrorValue(byte value) | void |
setCellErrorValue(byte value) 设置单元格的错误值 |
setCellFormula(java.lang.String formula) | void |
setCellFormula(java.lang.String formula) 设置此单元格的公式。 |
setCellStyle(CellStyle style) | void |
setCellStyle(CellStyle style) 设置单元格的样式。 |
setCellValue(boolean value) | void |
setCellValue(boolean value) 为单元格设置一个布尔值 |
setCellValue(java.util.Calendar value) | void |
setCellValue(java.util.Calendar value) 设置单元格的日期值。 |
setCellValue(java.util.Date value) | void |
setCellValue(java.util.Date value) 将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。 |
setCellValue(double value) | void |
setCellValue(double value) 为单元格设置一个数值。 |
setCellValue(java.time.LocalDate value) | default void |
setCellValue(java.time.LocalDate value) 将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。 |
setCellValue(java.time.LocalDateTime value) | void |
setCellValue(java.time.LocalDateTime value) 将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。 |
setCellValue(RichTextString value) | void |
setCellValue(RichTextString value) 为单元格设置一个丰富的字符串值。 |
setCellValue(java.lang.String value) | void |
setCellValue(java.lang.String value) 设置单元格的字符串值。 |
setHyperlink | void |
setHyperlink(Hyperlink link) 将超链接分配给该单元格 |
- 单元格应具有其编号(从0开始),然后才能添加到行中。
- 单元格可以是数字的,基于公式的或基于字符串的(文本)。
- 单元格类型对此进行指定。
- 字符串单元格不能包含数字,数字单元格不能包含字符串(至少根据我们的模型)。
- 客户端应用应自行进行转换。
- 公式单元格具有公式字符串以及公式结果,可以是数字或字符串。
XSSFCell 方 法 详 解
1. get
int getColumnIndex()
返回此单元格的列(从零开始)的索引
int getRowIndex()
返回包含该单元格的工作表中一行(从零开始)的行索引
Sheet getSheet()
返回此单元格所属的表。
Row getRow()
返回此单元格所属的行。
CellType getCellType()
返回单元格类型。
- CellType
- getCachedFormulaResultType
CellType getCachedFormulaResultType()
- 返回(
CellType.NUMERIC
,CellType.STRING
,CellType.BOOLEAN
,CellType.ERROR
)中的一个,这取决于式的缓存值。 - 仅对公式单元格有效
- getCellFormula
java.lang.String getCellFormula()
返回单元格的公式,例如, SUM(C4:E4)
- 返回值:
单元格的公式
- 抛出:
java.lang.IllegalStateException
-如果返回的单元格类型getCellType()
不是CellType.FORMULA
double getNumericCellValue()
以数字形式获取单元格的值。
对于字符串,我们抛出异常。对于空白单元格,我们返回0。对于公式或错误单元格,我们返回预先计算的值;对于单元格,则返回预先计算的值。
- 返回值:
单元格的数值
- 抛出:
java.lang.IllegalStateException
-如果返回的单元格类型getCellType()
为CellType.STRING
java.lang.NumberFormatException
-如果单元格值不是可分析的double
。
- 也可以看看:
java.util.Date getDateCellValue()
获取单元格的值作为日期。
对于字符串,我们抛出异常。对于空白单元格,我们返回空值。
- 返回值:
单元格的值作为日期
- 抛出:
java.lang.IllegalStateException
-如果返回的单元格类型getCellType()
为CellType.STRING
java.lang.NumberFormatException
-如果单元格值不是可分析的double
。
- 也可以看看:
java.time.LocalDateTime getLocalDateTimeCellValue()
获取单元格的值作为LocalDateTime。
对于字符串,我们抛出异常。对于空白单元格,我们返回空值。
- 返回值:
单元格的值作为LocalDateTime
- 抛出:
java.lang.IllegalStateException
-如果返回的单元格类型getCellType()
为CellType.STRING
java.lang.NumberFormatException
-如果单元格值不是可分析的double
。
- 也可以看看:
for formatting this date into a string similar to how excel does.
RichTextString getRichStringCellValue()
以XSSFRichTextString形式获取单元格的值。
对于数字单元格,我们抛出异常。对于空白单元格,我们返回一个空字符串。对于公式单元格,如果返回字符串,则返回预先计算的值,否则返回异常。
- RichTextString接口:http://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/RichTextString.html
- 返回值: 单元格的值作为XSSFRichTextString
- getStringCellValue
java.lang.String getStringCellValue()
返回字符串形式获取的单元格的值
对于数字单元格,抛出异常。
对于空白单元格,我们返回一个空字符串。
对于不是字符串Formulas的FormulaCells,抛出异常。
boolean getBooleanCellValue()
以布尔值形式获取单元格的值。
对于字符串,数字和错误,我们抛出异常。对于空白单元格,我们返回false。
- 返回值:
单元格的值,为布尔值
- 抛出:
java.lang.IllegalStateException
-如果返回的单元格类型getCellType()
不是CellType.BOOLEAN
,CellType.BLANK
或者CellType.FORMULA
byte getErrorCellValue()
获取单元格的值作为错误代码。
对于字符串,数字和布尔值,我们抛出一个异常。对于空白单元格,我们返回0。
- 返回值:
单元格的值作为错误代码
- 抛出:
java.lang.IllegalStateException
-如果返回的单元格类型getCellType()
不是CellType.ERROR
- 也可以看看:
CellStyle getCellStyle()
返回单元格的样式。
单元格的样式。总是不为空。默认单元格样式的索引为零,可以通过以下方式获得: workbook.getCellStyleAt(0)
- 也可以看看:
CellAddress getAddress()
获取此单元格的地址,这个地址时英文表示列、数组表示行的索引,如A1
。实际上就是打开Excel后所看到的Excel索引。
Comment getCellComment()
返回与此单元格关联的注释。
- Comment
- 返回值:
与此单元格相关的评论,null
如果找不到
Hyperlink getHyperlink()
- Hyperlink
- 返回值:
与此单元格关联的超链接,或者null
如果未找到
CellRangeAddress getArrayFormulaRange()
获取单元格所属的数组公式组的范围,仅对数组公式单元格有效
2. set
void setCellValue(boolean value)
为单元格设置一个布尔值
- 参数:
value
-将此单元格设置为的布尔值。对于公式,我们将设置预先计算的值,对于布尔值,我们将设置其值。对于其他类型,我们将单元格更改为布尔单元格并设置其值。
void setCellErrorValue(byte value)
设置单元格的错误值
- 参数:
value
-将此单元格设置为的错误值。对于公式,我们将设置预先计算的值,对于错误,我们将设置其值。对于其他类型,我们将单元格更改为错误单元格并设置其值。
- 也可以看看:
void setCellStyle(CellStyle style)
设置单元格的样式。样式应该是从工作簿创建/检索的CellStyle。
若要更改单元格的样式而不影响使用相同样式的其他单元格,请使用 CellUtil.setCellStyleProperties(Cell, Map)
- 参数:
style
-工作簿中包含的参考。如果该值为null,则样式信息将被删除,从而使该单元格使用默认的工作簿样式。
- 也可以看看:
void setAsActiveCell()
将此单元格设置为工作表的活动单元格
void setCellComment(Comment comment)
给该单元格设置注释。
- 参数:
comment
- 与该单元格相关的评论
void setBlank()
从单元格中删除公式和值,并将其类型设置为CellType.BLANK
。保留评论和超链接。虽然setCellType(CellType)
存在,是一个别名setCellType(CellType.BLANK)
。
void setCellValue(double value)
为单元格设置一个数值。
- 参数:
value
-将此单元格设置为的数值。对于公式,我们将设置预先计算的值,对于数字,我们将设置其值。对于其他类型,我们将单元格更改为数字单元格并设置其值。
void setCellValue(java.util.Date value)
将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。
注意-Excel中实际上没有’DATE’单元格类型。在许多情况下(输入日期值时),Excel会自动将单元格样式调整 为某种日期格式,从而产生一种错觉,即单元格数据类型现在不是CellType.NUMERIC
。POI不会尝试复制此行为。要将数字单元格显示为日期,请使用setCellStyle(CellStyle)
等。
- 参数:
value
-将此单元格设置为的数值。对于公式,我们将设置预先计算的值,对于数字,我们将设置其值。对于其他类型,我们将单元格更改为数字单元格并设置其值。
void setCellValue(java.time.LocalDateTime value)
将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。
注意-Excel中实际上没有’DATE’单元格类型。在许多情况下(输入日期值时),Excel会自动将单元格样式调整 为某种日期格式,从而产生一种错觉,即单元格数据类型现在不是CellType.NUMERIC
。POI不会尝试复制此行为。要将数字单元格显示为日期,请使用setCellStyle(CellStyle)
等。
- 参数:
value
-将此单元格设置为的数值。对于公式,我们将设置预先计算的值,对于数字,我们将设置其值。对于其他类型,我们将单元格更改为数字单元格并设置其值。
default void setCellValue(java.time.LocalDate value)
将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。
注意-Excel中实际上没有’DATE’单元格类型。在许多情况下(输入日期值时),Excel会自动将单元格样式调整 为某种日期格式,从而产生一种错觉,即单元格数据类型现在不是CellType.NUMERIC
。POI不会尝试复制此行为。要将数字单元格显示为日期,请使用setCellStyle(CellStyle)
等。
- 参数:
value
-将此单元格设置为的数值。对于公式,我们将设置预先计算的值,对于数字,我们将设置其值。对于其他类型,我们将单元格更改为数字单元格并设置其值。
void setCellValue(java.util.Calendar value)
设置单元格的日期值。Excel将日期视为数字,因此您需要将单元格设置为日期格式。
这将根据日历的时区设置单元格值。由于Excel不支持时区,这意味着20:00 + 03:00和20:00-03:00都将被报告为相同的值(20:00),即使两次之间相差6个小时。可以使用保留这种差异setCellValue(value.getTime())
,它将自动将时间转换为默认时区。
- 参数:
value
-将此单元格设置为的日期值。
对于公式,我们将设置预先计算的值,对于数字,我们将设置其值。对于其他类型,我们将单元格更改为数字单元格并设置其值。
void setCellValue(RichTextString value)
为单元格设置一个丰富的字符串值。
- 参数:
value
-将单元格设置为的值。对于公式,我们将设置公式字符串,对于字符串单元格,将设置其值。对于其他类型,我们将单元格更改为字符串单元格并设置其值。如果value为null,则将单元格更改为Blank单元格。
void setCellValue(java.lang.String value)
设置单元格的字符串值。
- 参数:
value
-将单元格设置为的值。对于公式,我们将设置公式字符串,对于字符串单元格,将设置其值。对于其他类型,我们将单元格更改为字符串单元格并设置其值。如果value为null,则将单元格更改为Blank单元格。
void setCellFormula(java.lang.String formula) throws FormulaParseException, java.lang.IllegalStateException
设置此单元格的公式。
如果formula
不为null,则设置或更新公式。如果formula
为null,则删除公式。或用于removeFormula()
删除公式。
请注意,此方法仅设置公式字符串,而不计算公式值。要设置预先计算的值,请使用setCellValue(double)
。
如果单元格为空白,则将值设置为0。否则,将值保留为预先计算的值。
- 参数:
formula
-要设置的公式,例如"SUM(C4:E4)"
。如果参数为,null
则当前公式将被删除。
- 抛出:
java.lang.IllegalStateException
-如果此单元格是包含其他单元格的数组公式组的一部分
FormulaParseException
-如果公式的语法不正确或无效
- 也可以看看:
void setHyperlink(Hyperlink link)
将超链接分配给该单元格
- 参数:
link
-与此单元格关联的超链接
3. remove
void removeFormula() throws java.lang.IllegalStateException
删除公式(如果有)。
如果单元格为空白,则保持原样。如果它是数组公式组的一部分,则将其空白。如果具有常规公式,则删除保留“缓存”值的公式。
- 抛出:
java.lang.IllegalStateException
-如果单元格是包含其他单元格的数组公式组的一部分
void removeCellComment()
删除对此单元格的注释(如果有的话)。
void removeHyperlink()
删除此单元格的超链接(如果有)。
boolean isPartOfArrayFormulaGroup()
单元格是否具有公共数组公式的单元格组的一部分
- 返回值: 如果此单元格是具有公共数组公式的单元格组的一部分,则为true。