使用 Apache POI 操作 Excel 文件的一些公共方法或示例
注:如果是老的 .xls 文件,数据导出时会有 65535 行的限制;此时可改用 .xlsx 文件作为模板。
| Type | Name and description |
|---|---|
static org.apache.poi.ss.usermodel.Comment |
addComment(org.apache.poi.ss.usermodel.Cell cell, String content, org.apache.poi.ss.usermodel.Font font = null, int colspan = 1, int rowspan = 3)给单元格添加备注 |
static org.apache.poi.ss.usermodel.DataValidation |
addDateValidation(org.apache.poi.ss.usermodel.Sheet sheet, org.apache.poi.ss.util.CellRangeAddressList rangeAddressList, String beginDate = "1900-01-01", String endDate = "2050-12-31", String format = "yyyy-mm-dd", String errorMsg = "请输入日期,如:2011-10-10!")设置日期校验 |
static org.apache.poi.ss.usermodel.DataValidation |
addNumericValidation(org.apache.poi.ss.usermodel.Sheet sheet, org.apache.poi.ss.util.CellRangeAddressList rangeAddressList, String beginNum, String endNum, String errorMsg)设置数字范围校验 |
static org.apache.poi.ss.usermodel.DataValidation |
addSelectValidation(org.apache.poi.ss.usermodel.Sheet sheet, org.apache.poi.ss.util.CellRangeAddressList rangeAddressList, Object listOrFormula, String errorMsg)设置单元格校验和下拉列表 |
static void |
closeWorkbook(org.apache.poi.ss.usermodel.Workbook wb)关闭 Workbook。 |
static int |
columnABCToNum(String abc)将 Excel 里的大写字母的列号转成数字序号 |
static String |
columnNumToABC(int num)将列号转成大写字母表示的序号(如 A、AB...) |
static boolean |
containsExcelFile(javax.servlet.http.HttpServletRequest request)判断 HTTP 请求中是否包含 Excel 附件 |
static void |
copyAndAppendRows(org.apache.poi.ss.usermodel.Row row, Integer count, Map options = null)复制行,并插入到后面 |
static org.apache.poi.ss.usermodel.Font |
createCommonFont(org.apache.poi.ss.usermodel.Workbook wb)(示例)创建一个最常用的Font:小五号宋体 |
static org.apache.poi.ss.usermodel.Name |
createName(org.apache.poi.ss.usermodel.Workbook wb, String name, String refersToFormula)创建名称 |
static org.apache.poi.ss.usermodel.Name |
createName(org.apache.poi.ss.usermodel.Sheet sheet, String name, int rowNum1, int rowNum2, int colNum1, int colNum2)创建名称 |
static org.apache.poi.ss.util.CellRangeAddressList |
createRangeAddressList(int rowNum1, int rowNum2, int colNum1, int colNum2)创建一个 CellRangeAddressList,供 addXxxValidation 等方法使用 |
static org.apache.poi.xssf.streaming.SXSSFWorkbook |
createSXSSFWorkbook(org.apache.poi.xssf.usermodel.XSSFWorkbook workbook = null, Integer rowAccessWindowSize = SXSSFWorkbook.DEFAULT_WINDOW_SIZE)创建(封装)一个基于流的 .xlsx 格式的 Workbook |
static org.apache.poi.ss.usermodel.Sheet |
createSheet(org.apache.poi.ss.usermodel.Workbook wb, String name)创建 Sheet |
static Map<String, org.apache.poi.ss.usermodel.CellStyle> |
createStyles(org.apache.poi.ss.usermodel.Workbook wb)(示例)初始化一些可能需要用到的样式 |
static org.apache.poi.ss.usermodel.Workbook |
createWorkbook()创建 Workbook |
static org.apache.poi.ss.usermodel.Workbook |
createXSSFWorkbook()创建一个 .xlsx 格式的 Workbook |
static List<String> |
getAllNames(org.apache.poi.ss.usermodel.Workbook wb)从 Excel 中读出所有的“名称” |
static Object |
getCellValue(org.apache.poi.ss.usermodel.Cell cell, org.apache.poi.ss.usermodel.FormulaEvaluator evaluator = null, Integer rowIdx = null, Integer cellIdx = null)获得单元格的内容 |
static String |
getCellValueString(org.apache.poi.ss.usermodel.Cell cell, org.apache.poi.ss.usermodel.FormulaEvaluator evaluator = null)获得单元格的文字内容,数字自动转成文字 |
static Date |
getDateCellValue(org.apache.poi.ss.usermodel.Cell cell)获得单元格的日期内容,如果转换错误,则返回null |
static List |
getNamedValues(org.apache.poi.ss.usermodel.Workbook wb, String name)根据名称获得值的列表 |
static String |
getStringCellValue(org.apache.poi.ss.usermodel.Cell cell)获得内容为字符串的单元格的内容 |
static void |
mergeCells(org.apache.poi.ss.usermodel.Sheet sheet, int rowNum1, int rowNum2, int colNum1, int colNum2)合并单元格(居中等属性集成原来的单元格的设置) |
static org.apache.poi.ss.usermodel.Workbook |
openWorkbook(String filename)打开 Workbook |
static org.apache.poi.ss.usermodel.Workbook |
openWorkbook(java.io.File file) |
static org.apache.poi.ss.usermodel.Workbook |
openWorkbook(java.io.InputStream is) |
static org.apache.poi.ss.usermodel.Workbook |
openWorkbook(javax.servlet.http.HttpServletRequest request)打开上传附件中的 Excel 文件 |
static Map |
readAll(String filename, boolean spannable = false)从 Excel 文件中读出所有信息,拼成一个Map(键为 sheet 名,值为表示行、列的二维列表)返回 |
static Map |
readAll(javax.servlet.http.HttpServletRequest request, boolean spannable = false)从上传的 Excel 文件中读出所有信息,拼成一个 Map 返回 |
static Map<String, List> |
readAllOfNames(String filename)从 Excel 文件中读出 “名称” 中的所有值 |
static Map<String, List> |
readAllOfNames(javax.servlet.http.HttpServletRequest request)从上传的 Excel 文件中读出 “名称” 中的所有值 |
static List<Map> |
readAllToMaps(List<List> rows, List<String> keys, List<String> headers, Integer headerRowIndex)将 readAll 中的二维列表数据,转换成 Map 列表 |
static void |
render(org.apache.poi.ss.usermodel.Workbook wb, String filename, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)将 Excel 文件输出到浏览器 |
static void |
render(String filepath, String filename, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)将 Excel 文件输出到浏览器 |
static void |
renderWithoutFormat(Collection collection, String filename, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)将2维集合(对应行、列)直接转换成Excel。 |
static java.io.File |
saveWorkbook(org.apache.poi.ss.usermodel.Workbook wb, String filename)保存Excel到文件系统 |
static void |
setCellFormula(org.apache.poi.ss.usermodel.Cell cell, String formula)在单元格中设置一个公式 |
static void |
setCellValue(org.apache.poi.ss.usermodel.Cell cell, Object value)设置单元格的值 |
static void |
setNamedValue(org.apache.poi.ss.usermodel.Workbook wb, String name, Object value, Map options = null)根据名称对单元格赋值 |
static void |
setNamedValues(org.apache.poi.ss.usermodel.Workbook wb, Map<String, Object> namedValues, Map options = null)根据名称对单元格赋值 |
static void |
setNamedValues(org.apache.poi.ss.usermodel.Workbook wb, List<Map<String, Object>> namedValuesList, Map options = null)根据名称对单元格赋值 |
static void |
setPageSetup(org.apache.poi.ss.usermodel.Sheet sheet)(示例)页面设置:打印、页脚等 |
static org.apache.poi.ss.usermodel.CellStyle |
setStyleBorder(org.apache.poi.ss.usermodel.CellStyle style)(示例)给Style设置黑色的细边框 |
| Methods inherited from class | Name |
|---|---|
class Object |
Object#wait(long, int), Object#wait(long), Object#wait(), Object#equals(Object), Object#toString(), Object#hashCode(), Object#getClass(), Object#notify(), Object#notifyAll() |
给单元格添加备注
cell - 单元格对象content - 备注内容font - 字体colspan - 备注框的大小:所占列数rowspan - 备注框的大小:所占行数设置日期校验
sheet - 工作表对象rangeAddressList - CellRangeAddressList对象,创建数据有效性对象用;可通过 createRangeAddressList 方法创建beginDate - 开始日期endDate - 结束日期format - 格式化样式errorMsg - 错误提示信息设置数字范围校验
sheet - 工作表对象rangeAddressList - CellRangeAddressList对象,创建数据有效性对象用;可通过 createRangeAddressList 方法创建beginNum - 开始数字endNum - 结束数字errorMsg - 错误提示信息设置单元格校验和下拉列表
sheet - 工作表对象rangeAddressList - CellRangeAddressList对象,创建数据有效性对象用;可通过 createRangeAddressList 方法创建listOrFormula - 下拉列表的内容列表、或者公式(如名称、"\$A\$8:\$A:9"等)errorMsg - 错误提示信息关闭 Workbook。如果是 SXSSFWorkbook 还会调用 dispose 以释放临时文件。
将 Excel 里的大写字母的列号转成数字序号
将列号转成大写字母表示的序号(如 A、AB...)
判断 HTTP 请求中是否包含 Excel 附件
复制行,并插入到后面
注意:对于 Excel 中插入的表格、以及对应的汇总行,暂时无法使用本API,否则操作后的样式、公式都会有问题。
row - 要复制的行count - 插入的行数(示例)创建一个最常用的Font:小五号宋体
wb - 工作簿对象创建名称
wb - 工作簿对象name - 想要创建的名称refersToFormula - 形如 "Sheet1!\$A\$1:\$A\$3" 的名称范围创建名称
sheet - 工作表对象name - 想要创建的名称rowNum1 - 范围:开始行号,注意以 0 开始rowNum2 - 范围:结束行号colNum1 - 范围:开始列号,注意以 0 开始colNum2 - 范围:结束列号创建一个 CellRangeAddressList,供 addXxxValidation 等方法使用
rowNum1 - 范围:开始行号,注意以 0 开始rowNum2 - 范围:结束行号colNum1 - 范围:开始列号,注意以 0 开始colNum2 - 范围:结束列号创建(封装)一个基于流的 .xlsx 格式的 Workbook
用于避免写入大文件时内存溢出,但使用完毕后务必调用 wb.dispose() 删除临时文件(或者调用 closeWorkbook 方法)。
参考:http://poi.apache.org/components/spreadsheet/how-to.html#sxssf
注1:SXSSFWorkbook 不支持 createName、setNamedValues 等基于名称的方法;并且无法在比较大的行区间内操作(rowAccessWindowSize 决定),比如写入1000行数据后,回头来操作第1行(getRow 会返回 null)。
注2:如果有参数 workbook 模板,想通过返回的 wb 获得模板里的数据,必须用 wb.getXSSFWorkbook().getRow(N),否则始终返回 null。
workbook - 模板。仅用于添加新行、或者新 sheet,或复用模板中的全局对象(比如全局的样式、格式等)。创建 Sheet
wb - 工作簿对象name - 要创建的工作表名称(示例)初始化一些可能需要用到的样式
wb - 工作簿对象创建 Workbook
为保证兼容性,这里创建的是老版的(.xls)的 Workbook。如果需要新的,可使用 createXSSFWorkbook 或 createSXSSFWorkbook(支持大文件)。
但为了避免每个 sheet 的数据不能超过 65535 行的限制,仍然建议使用新版的 .xlsx。
创建一个 .xlsx 格式的 Workbook
从 Excel 中读出所有的“名称”
获得单元格的内容
cell - 单元格evaluator - 如果可能是公式的话,创建一个FormulaEvaluator传过来,以进行转换,(并提升性能、避免在多次调用时本方法内多次创建)rowIdx - 发生异常时,在日志中打印行号cellIdx - 发生异常时,在日志中打印列号获得单元格的文字内容,数字自动转成文字
cell - 单元格evaluator -
如果可能是公式的话,创建一个FormulaEvaluator传过来,以进行转换,(并提升性能、避免在多
次调用时本方法内多次创建)
获得单元格的日期内容,如果转换错误,则返回null
cell - 单元格根据名称获得值的列表
获得内容为字符串的单元格的内容
合并单元格(居中等属性集成原来的单元格的设置)
sheet - 工作表对象rowNum1 - 范围:开始行号,注意以 0 开始rowNum2 - 范围:结束行号colNum1 - 范围:开始列号,注意以 0 开始colNum2 - 范围:结束列号打开 Workbook
filename - 文件名打开上传附件中的 Excel 文件
从 Excel 文件中读出所有信息,拼成一个Map(键为 sheet 名,值为表示行、列的二维列表)返回
filename - 文件路径spannable - 默认为否,返回结果的 value 二维列表中,每一个值表示该单元格的值,如 [["a", "b", "c" ],...]。[[[value: "a", row: 0, col: 0, rowspan: 2], null, ...], ...]从上传的 Excel 文件中读出所有信息,拼成一个 Map 返回
从 Excel 文件中读出 “名称” 中的所有值
filename - 文件名从上传的 Excel 文件中读出 “名称” 中的所有值
filename - 文件名将 readAll 中的二维列表数据,转换成 Map 列表
例如:
Map data = ExcelUtils.readAll(request, false) // 这里 spannable 必须为 false
if (!data.error) {
ExcelUtils.readAllToMaps(data.values().first(), ["fullName", "level"], ["机构全名", "机构级别"], 1)
}
rows - 调用 readAll(xxx, false) 返回的某个页签中的数据keys - 返回值的键值列表,如果没有 headers,则和 Excel 中的列号(从 0 开始)一一对应headers - 和 keys 对应的 Excel 中表头单元格文字,如 key 的 “fullName” 对应 “机构全名” 列headerRowIndex - 表头所在的行号,默认为 0 即第一行将 Excel 文件输出到浏览器
将 Excel 文件输出到浏览器
参数 filepath 和 filename 必须有一个有扩展名,且为 xlsx 或 xls。
filepath - 文件路径filename - 下载后的文件名将2维集合(对应行、列)直接转换成Excel。
注:日期类型的会设置默认的格式 “yyyy-mm-dd”
collection - 需要转换的二维数组filename - 输出的文件名,如果是输出到文件系统,则必须为绝对路径request - 如果要输出到浏览器,则不能为空response - 如果要输出到浏览器,则不能为空保存Excel到文件系统
wb - 工作簿对象filename - 文件名在单元格中设置一个公式
cell - 单元格对象formula - 公式字符串,不需要以“=”开头设置单元格的值
cell - 单元格value - 日期、数字、字符串等类型的值,如果是 Excel 不支持的数据类型,会自动转成字符串根据名称对单元格赋值
为了避免赋值后格式丢失,建议将模板文件保存为【.xls】的 “Excel 97-2003 工作簿”。
但为了避免每个 sheet 的数据不能超过 65535 行的限制,仍然建议使用新的 【.xlsx】 模板,并做格式相关的测试。
value - 单元格的值。options.addrows - 是否自动添加行;基于样式的考虑,模板中建议至少设置3行,会自动复制倒数第 2 行。options.delrows - 是否删除多余的行;如果为数字,则会保留多余的 N 行,并删除剩余的行。基于样式的考虑,优先从倒数第 2 行往上删除。根据名称对单元格赋值
namedValues - 要导出的数据,每个键值对中的值可以是列表根据名称对单元格赋值
namedValuesList - 列表形式的数据(示例)页面设置:打印、页脚等
sheet - 工作表对象(示例)给Style设置黑色的细边框
style - CellStyle对象(样式)