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

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

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中的现有工作表创建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;

构造器

方法 描述 修饰符和类型
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() 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

  • getColumnIndex
int getColumnIndex()

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

  • getRowIndex
int getRowIndex()

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

  • getSheet
Sheet getSheet()

返回此单元格所属的

  • getRow
Row getRow()

返回此单元格所属的

  • getCellType
CellType  getCellType()

返回单元格类型。

CellType  getCachedFormulaResultType()
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形式获取单元格的值。

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

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。
目录
相关文章
|
15天前
|
Java 开发者
Java 中的 toString() 方法详解:为什么它如此重要?
在Java开发中,`toString()`方法至关重要,用于返回对象的字符串表示。默认实现仅输出类名和哈希码,信息有限且不直观。通过重写`toString()`,可展示对象字段值,提升调试效率与代码可读性。借助Lombok的`@Data`注解,能自动生成标准化的`toString()`方法,简化开发流程,尤其适合字段较多的场景。合理运用`toString()`,可显著提高开发效率与代码质量。
47 0
|
15天前
|
存储 Java 开发者
Java 中的 equals 方法:看似简单,实则深藏玄机
本文深入探讨了Java中`equals`方法的设计与实现。默认情况下,`equals`仅比较对象引用是否相同。以`String`类为例,其重写了`equals`方法,通过引用判断、类型检查、长度对比及字符逐一比对,确保内容相等的逻辑。文章还强调了`equals`方法需遵循的五大原则(自反性、对称性等),以及与`hashCode`的关系,避免集合操作中的潜在问题。最后,对比了`instanceof`和`getClass()`在类型判断中的优劣,并总结了正确重写`equals`方法的重要性,帮助开发者提升代码质量。
49 1
|
1月前
|
存储 JSON Java
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
55 25
|
3月前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
15天前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
25 0
|
1月前
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
57 1
|
2月前
|
存储 安全 算法
Java容器及其常用方法汇总
Java Collections框架提供了丰富的接口和实现类,用于管理和操作集合数据。
Java容器及其常用方法汇总
|
1月前
|
运维 Java 程序员
Java中的异常处理方法
本文深入剖析Java异常处理机制,介绍可检查异常、运行时异常和错误的区别与处理方式。通过最佳实践方法,如使用合适的异常类型、声明精确异常、try-with-resources语句块、记录异常信息等,帮助开发者提高代码的可靠性、可读性和可维护性。良好的异常处理能保证程序稳定运行,避免资源泄漏和潜在问题。
|
1月前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
89 5
|
2月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
258 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡

热门文章

最新文章

下一篇
oss创建bucket