当前仍在编辑文章 - Java Excel处理 - 实操案例与方法手册

本文介绍使用Java POI库处理Excel文件的方法,包括读取不同版本的Excel文件、操作单元格及工作表等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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允许对文档中的所有行进行访问。不再存在于窗口中的较旧的行由于被写入磁盘而变得不可访问。
实 例 目 录
  1. Excel读取
    1.1 xls文件的读取
    1.2 .xlsx文件的读取
  2. 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中的现有工作表创建XSSFSheetXSSFSheet
cloneSheet(int sheetNum, java.lang.String newName)从XSSFWorkbook中的现有工作表创建XSSFSheetXSSFSheet
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 beanorg.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook
getCustomXMLMappings()java.util.Collection
getExternalLinksTable()返回此工作簿的外部链接表(ExternalLinks)对象列表java.util.List
getFirstVisibleTab()获取excel中tab列表中显示的第一个tabint
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 sheetint
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)按照给定的索引值删除sheetvoid
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;

构造器

方法描述修饰符和类型
XSSFChartSheetPackagePart part)protected

2.3 XSSFRow

import org.apache.poi.xssf.usermodel.XSSFRow;

2.4 XSSFCell

电子表格行中单元格的高级表示形式

import org.apache.poi.xssf.usermodel.XSSFCell;

XSSFCell类 - 方 法 目 录

方法修饰符和类型方法和说明
getAddress()CellAddressgetAddress()获取此单元格的Excel地址,如 A1
CellRangeAddress()CellRangeAddressgetArrayFormulaRange()仅对数组公式单元格有效
getBooleanCellValue()booleangetBooleanCellValue()以布尔值形式获取单元格的值。
getCachedFormulaResultType()CellTypegetCachedFormulaResultType()仅对公式单元格有效
getCellComment()CommentgetCellComment()返回与此单元格关联的注释
getCellFormula()java.lang.StringgetCellFormula()返回单元格的公式,例如, SUM(C4:E4)
getCellStyle()CellStylegetCellStyle()返回单元格的样式。
getCellType()CellTypegetCellType()返回单元格类型。
getColumnIndex()intgetColumnIndex()返回此单元格的列索引
getDateCellValue()java.util.DategetDateCellValue()获取单元格的值作为日期。
getErrorCellValue()bytegetErrorCellValue()获取单元格的值作为错误代码。
getHyperlink()HyperlinkgetHyperlink()
getLocalDateTimeCellValue()java.time.LocalDateTimegetLocalDateTimeCellValue()获取单元格的值作为LocalDateTime。
getNumericCellValue()doublegetNumericCellValue()以数字形式获取单元格的值。
getRichStringCellValue()RichTextStringgetRichStringCellValue()以XSSFRichTextString形式获取单元格的值
getRow()RowgetRow()返回此单元格所属的行
getRowIndex(getRowIndex)intgetRowIndex()返回包含该单元格的工作表中一行的行索引
getSheet()SheetgetSheet()返回此单元格所属的工作表
getStringCellValue()java.lang.StringgetStringCellValue()以字符串形式获取单元格的值
isPartOfArrayFormulaGroup()booleanisPartOfArrayFormulaGroup()
removeCellComment()voidremoveCellComment()删除对此单元格的注释(如果有的话)。
removeFormula()voidremoveFormula()删除公式(如果有)。
removeHyperlink()voidremoveHyperlink()删除此单元格的超链接(如果有)。
setAsActiveCell()voidsetAsActiveCell()将此单元格设置为工作表的活动单元格
setBlank()voidsetBlank()从单元格中删除公式和值,并将其类型设置为CellType.BLANK
setCellComment(Comment comment)voidsetCellComment(Comment comment)给该单元格分配评论
setCellErrorValue(byte value)voidsetCellErrorValue(byte value)设置单元格的错误值
setCellFormula(java.lang.String formula)voidsetCellFormula(java.lang.String formula)设置此单元格的公式。
setCellStyle(CellStyle style)voidsetCellStyle(CellStyle style)设置单元格的样式。
setCellValue(boolean value)voidsetCellValue(boolean value)为单元格设置一个布尔值
setCellValue(java.util.Calendar value)voidsetCellValue(java.util.Calendar value)设置单元格的日期值。
setCellValue(java.util.Date value)voidsetCellValue(java.util.Date value)将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。
setCellValue(double value)voidsetCellValue(double value)为单元格设置一个数值。
setCellValue(java.time.LocalDate value)default voidsetCellValue(java.time.LocalDate value)将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。
setCellValue(java.time.LocalDateTime value)voidsetCellValue(java.time.LocalDateTime value)将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。
setCellValue(RichTextString value)voidsetCellValue(RichTextString value)为单元格设置一个丰富的字符串值。
setCellValue(java.lang.String value)voidsetCellValue(java.lang.String value)设置单元格的字符串值。
setHyperlinkvoidsetHyperlink(Hyperlink link)将超链接分配给该单元格
  • 单元格应具有其编号(从0开始),然后才能添加到行中。
  • 单元格可以是数字的,基于公式的或基于字符串的(文本)。
  • 单元格类型对此进行指定。
  • 字符串单元格不能包含数字,数字单元格不能包含字符串(至少根据我们的模型)。
  • 客户端应用应自行进行转换。
  • 公式单元格具有公式字符串以及公式结果,可以是数字或字符串。

XSSFCell 方 法 详 解

1. get

  • getColumnIndex
int getColumnIndex()

返回此单元格的列(从零开始)的索引

  • getRowIndex
int getRowIndex()

返回包含该单元格的工作表中一行(从零开始)的行索引

  • getSheet
Sheet getSheet()

返回此单元格所属的

  • getRow
Row getRow()

返回此单元格所属的

  • getCellType
CellType  getCellType()

返回单元格类型。

  • getCachedFormulaResultType
CellType  getCachedFormulaResultType()

  • getCellFormula
java.lang.String getCellFormula()

返回单元格的公式,例如, SUM(C4:E4)

  • 返回值:

单元格的公式

  • 抛出:

java.lang.IllegalStateException-如果返回的单元格类型getCellType()不是CellType.FORMULA

  • getNumericCellValue
double getNumericCellValue()

以数字形式获取单元格的值。

对于字符串,我们抛出异常。对于空白单元格,我们返回0。对于公式或错误单元格,我们返回预先计算的值;对于单元格,则返回预先计算的值。

  • 返回值:

单元格的数值

  • 抛出:

java.lang.IllegalStateException-如果返回的单元格类型getCellType()CellType.STRING

java.lang.NumberFormatException-如果单元格值不是可分析的double

  • 也可以看看:

用于将该数字转换为类似于Excel将该数字呈现为的字符串。

  • getDateCellValue
java.util.Date getDateCellValue()

获取单元格的值作为日期。

对于字符串,我们抛出异常。对于空白单元格,我们返回空值。

  • 返回值:

单元格的值作为日期

  • 抛出:

java.lang.IllegalStateException-如果返回的单元格类型getCellType()CellType.STRING

java.lang.NumberFormatException-如果单元格值不是可分析的double

  • 也可以看看:

用于将该日期格式化为类似于excel的字符串.

  • getLocalDateTimeCellValue
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.

  • getRichStringCellValue
RichTextString getRichStringCellValue()

以XSSFRichTextString形式获取单元格的值。

对于数字单元格,我们抛出异常。对于空白单元格,我们返回一个空字符串。对于公式单元格,如果返回字符串,则返回预先计算的值,否则返回异常。

  • getStringCellValue
java.lang.String getStringCellValue()

返回字符串形式获取的单元格的值

对于数字单元格,抛出异常。
对于空白单元格,我们返回一个空字符串。
对于不是字符串Formulas的FormulaCells,抛出异常。

  • getBooleanCellValue
boolean getBooleanCellValue()

以布尔值形式获取单元格的值。

对于字符串,数字和错误,我们抛出异常。对于空白单元格,我们返回false。

  • 返回值:

单元格的值,为布尔值

  • 抛出:

java.lang.IllegalStateException-如果返回的单元格类型getCellType() 不是CellType.BOOLEANCellType.BLANK或者CellType.FORMULA

  • getErrorCellValue
byte getErrorCellValue()

获取单元格的值作为错误代码。

对于字符串,数字和布尔值,我们抛出一个异常。对于空白单元格,我们返回0。

  • 返回值:

单元格的值作为错误代码

  • 抛出:

java.lang.IllegalStateException-如果返回的单元格类型getCellType()不是CellType.ERROR

  • 也可以看看:

for error codes

  • getCellStyle
CellStyle getCellStyle()

返回单元格的样式。

单元格的样式。总是不为空。默认单元格样式的索引为零,可以通过以下方式获得: workbook.getCellStyleAt(0)

  • 也可以看看:

Workbook.getCellStyleAt(int)

  • getAddress
CellAddress  getAddress()

获取此单元格的地址,这个地址时英文表示列、数组表示行的索引,如A1。实际上就是打开Excel后所看到的Excel索引。

  • getCellComment
Comment getCellComment()

返回与此单元格关联的注释。

与此单元格相关的评论,null如果找不到

  • getHyperlink
Hyperlink getHyperlink()

与此单元格关联的超链接,或者null如果未找到

  • getArrayFormulaRange
CellRangeAddress getArrayFormulaRange()

获取单元格所属的数组公式组的范围,仅对数组公式单元格有效

2. set

  • setCellValue
void setCellValue(boolean value)

为单元格设置一个布尔值

  • 参数:

value-将此单元格设置为的布尔值。对于公式,我们将设置预先计算的值,对于布尔值,我们将设置其值。对于其他类型,我们将单元格更改为布尔单元格并设置其值。

  • setCellErrorValue
void setCellErrorValue(byte value)

设置单元格的错误值

  • 参数:

value-将此单元格设置为的错误值。对于公式,我们将设置预先计算的值,对于错误,我们将设置其值。对于其他类型,我们将单元格更改为错误单元格并设置其值。

  • 也可以看看:

FormulaError

  • setCellStyle
void setCellStyle(CellStyle style)

设置单元格的样式。样式应该是从工作簿创建/检索的CellStyle。

若要更改单元格的样式而不影响使用相同样式的其他单元格,请使用 CellUtil.setCellStyleProperties(Cell, Map)

  • 参数:

style-工作簿中包含的参考。如果该值为null,则样式信息将被删除,从而使该单元格使用默认的工作簿样式。

  • 也可以看看:

Workbook.createCellStyle()

  • setAsActiveCell
void setAsActiveCell()

将此单元格设置为工作表的活动单元格

  • setCellComment
void setCellComment(Comment comment)

给该单元格设置注释。

  • 参数:

comment - 与该单元格相关的评论

  • setBlank
void setBlank()

从单元格中删除公式和值,并将其类型设置为CellType.BLANK。保留评论和超链接。虽然setCellType(CellType)存在,是一个别名setCellType(CellType.BLANK)

  • setCellValue
void setCellValue(double value)

为单元格设置一个数值。

  • 参数:

value-将此单元格设置为的数值。对于公式,我们将设置预先计算的值,对于数字,我们将设置其值。对于其他类型,我们将单元格更改为数字单元格并设置其值。

  • setCellValue
void setCellValue(java.util.Date value)

将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。

注意-Excel中实际上没有’DATE’单元格类型。在许多情况下(输入日期值时),Excel会自动将单元格样式调整 为某种日期格式,从而产生一种错觉,即单元格数据类型现在不是CellType.NUMERIC。POI不会尝试复制此行为。要将数字单元格显示为日期,请使用setCellStyle(CellStyle)等。

  • 参数:

value-将此单元格设置为的数值。对于公式,我们将设置预先计算的值,对于数字,我们将设置其值。对于其他类型,我们将单元格更改为数字单元格并设置其值。

  • setCellValue
void setCellValue(java.time.LocalDateTime value)

将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。

注意-Excel中实际上没有’DATE’单元格类型。在许多情况下(输入日期值时),Excel会自动将单元格样式调整 为某种日期格式,从而产生一种错觉,即单元格数据类型现在不是CellType.NUMERIC。POI不会尝试复制此行为。要将数字单元格显示为日期,请使用setCellStyle(CellStyle)等。

  • 参数:

value-将此单元格设置为的数值。对于公式,我们将设置预先计算的值,对于数字,我们将设置其值。对于其他类型,我们将单元格更改为数字单元格并设置其值。

  • setCellValue
default void setCellValue(java.time.LocalDate value)

将提供的日期转换为其等效的Excel数值,并将其设置到单元格中。

注意-Excel中实际上没有’DATE’单元格类型。在许多情况下(输入日期值时),Excel会自动将单元格样式调整 为某种日期格式,从而产生一种错觉,即单元格数据类型现在不是CellType.NUMERIC。POI不会尝试复制此行为。要将数字单元格显示为日期,请使用setCellStyle(CellStyle)等。

  • 参数:

value-将此单元格设置为的数值。对于公式,我们将设置预先计算的值,对于数字,我们将设置其值。对于其他类型,我们将单元格更改为数字单元格并设置其值。

  • setCellValue
void setCellValue(java.util.Calendar value)

设置单元格的日期值。Excel将日期视为数字,因此您需要将单元格设置为日期格式。

这将根据日历的时区设置单元格值。由于Excel不支持时区,这意味着20:00 + 03:00和20:00-03:00都将被报告为相同的值(20:00),即使两次之间相差6个小时。可以使用保留这种差异setCellValue(value.getTime()),它将自动将时间转换为默认时区。

  • 参数:

value-将此单元格设置为的日期值。
对于公式,我们将设置预先计算的值,对于数字,我们将设置其值。对于其他类型,我们将单元格更改为数字单元格并设置其值。

  • setCellValue
void setCellValue(RichTextString  value)

为单元格设置一个丰富的字符串值。

  • 参数:

value-将单元格设置为的值。对于公式,我们将设置公式字符串,对于字符串单元格,将设置其值。对于其他类型,我们将单元格更改为字符串单元格并设置其值。如果value为null,则将单元格更改为Blank单元格。

  • setCellValue
void setCellValue(java.lang.String value)

设置单元格的字符串值。

  • 参数:

value-将单元格设置为的值。对于公式,我们将设置公式字符串,对于字符串单元格,将设置其值。对于其他类型,我们将单元格更改为字符串单元格并设置其值。如果value为null,则将单元格更改为Blank单元格。

  • setCellFormula
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 -如果公式的语法不正确或无效

  • 也可以看看:

removeFormula()

  • setHyperlink
void setHyperlink(Hyperlink link)

将超链接分配给该单元格

  • 参数:

link -与此单元格关联的超链接

3. remove

  • removeFormula
void removeFormula()
            throws java.lang.IllegalStateException

删除公式(如果有)。
如果单元格为空白,则保持原样。如果它是数组公式组的一部分,则将其空白。如果具有常规公式,则删除保留“缓存”值的公式。

  • 抛出:

java.lang.IllegalStateException -如果单元格是包含其他单元格的数组公式组的一部分

  • removeCellComment
void removeCellComment()

删除对此单元格的注释(如果有的话)。

  • removeHyperlink
void removeHyperlink()

删除此单元格的超链接(如果有)。

  • isPartOfArrayFormulaGroup
boolean isPartOfArrayFormulaGroup()

单元格是否具有公共数组公式的单元格组的一部分

  • 返回值: 如果此单元格是具有公共数组公式的单元格组的一部分,则为true。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jcLee95

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值