add setRowStyle

This commit is contained in:
Looly 2020-10-15 09:59:27 +08:00
parent 97d48dde0b
commit 3237df0855
2 changed files with 170 additions and 139 deletions

View File

@ -18,6 +18,7 @@
* 【core 】 完善注释pr#193@Gitee * 【core 】 完善注释pr#193@Gitee
* 【core 】 优化Combination.countAllpr#1159@Github * 【core 】 优化Combination.countAllpr#1159@Github
* 【core 】 优化针对list的split方法pr#194@Gitee * 【core 】 优化针对list的split方法pr#194@Gitee
* 【poi 】 ExcelWriter增加setRowStyle方法
### Bug修复 ### Bug修复
* 【core 】 解决农历判断节日未判断大小月导致的问题issue#I1XHSF@Gitee * 【core 】 解决农历判断节日未判断大小月导致的问题issue#I1XHSF@Gitee

View File

@ -44,38 +44,53 @@ import java.util.concurrent.atomic.AtomicInteger;
/** /**
* Excel 写入器<br> * Excel 写入器<br>
* 此工具用于通过POI将数据写出到Excel此对象可完成以下两个功能 * 此工具用于通过POI将数据写出到Excel此对象可完成以下两个功能
* *
* <pre> * <pre>
* 1. 编辑已存在的Excel可写出原Excel文件也可写出到其它地方到文件或到流 * 1. 编辑已存在的Excel可写出原Excel文件也可写出到其它地方到文件或到流
* 2. 新建一个空的Excel工作簿完成数据填充后写出到文件或到流 * 2. 新建一个空的Excel工作簿完成数据填充后写出到文件或到流
* </pre> * </pre>
* *
* @author Looly * @author Looly
* @since 3.2.0 * @since 3.2.0
*/ */
public class ExcelWriter extends ExcelBase<ExcelWriter> { public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** 目标文件 */ /**
* 目标文件
*/
protected File destFile; protected File destFile;
/** 当前行 */ /**
* 当前行
*/
private AtomicInteger currentRow = new AtomicInteger(0); private AtomicInteger currentRow = new AtomicInteger(0);
/** 标题行别名 */ /**
* 标题行别名
*/
private Map<String, String> headerAlias; private Map<String, String> headerAlias;
/** 是否只保留别名对应的字段 */ /**
* 是否只保留别名对应的字段
*/
private boolean onlyAlias; private boolean onlyAlias;
/** 标题顺序比较器 */ /**
* 标题顺序比较器
*/
private Comparator<String> aliasComparator; private Comparator<String> aliasComparator;
/** 样式集,定义不同类型数据样式 */ /**
* 样式集定义不同类型数据样式
*/
private StyleSet styleSet; private StyleSet styleSet;
/** 标题项对应列号缓存,每次写标题更新此缓存 */ /**
* 标题项对应列号缓存每次写标题更新此缓存
*/
private Map<String, Integer> headLocationCache; private Map<String, Integer> headLocationCache;
// -------------------------------------------------------------------------- Constructor start // -------------------------------------------------------------------------- Constructor start
/** /**
* 构造默认生成xls格式的Excel文件<br> * 构造默认生成xls格式的Excel文件<br>
* 此构造不传入写出的Excel文件路径只能调用{@link #flush(OutputStream)}方法写出到流<br> * 此构造不传入写出的Excel文件路径只能调用{@link #flush(OutputStream)}方法写出到流<br>
* 若写出到文件还需调用{@link #setDestFile(File)}方法自定义写出的文件然后调用{@link #flush()}方法写出到文件 * 若写出到文件还需调用{@link #setDestFile(File)}方法自定义写出的文件然后调用{@link #flush()}方法写出到文件
* *
* @since 3.2.1 * @since 3.2.1
*/ */
public ExcelWriter() { public ExcelWriter() {
@ -86,7 +101,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 构造<br> * 构造<br>
* 此构造不传入写出的Excel文件路径只能调用{@link #flush(OutputStream)}方法写出到流<br> * 此构造不传入写出的Excel文件路径只能调用{@link #flush(OutputStream)}方法写出到流<br>
* 若写出到文件需要调用{@link #flush(File)} 写出到文件 * 若写出到文件需要调用{@link #flush(File)} 写出到文件
* *
* @param isXlsx 是否为xlsx格式 * @param isXlsx 是否为xlsx格式
* @since 3.2.1 * @since 3.2.1
*/ */
@ -96,7 +111,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 构造默认写出到第一个sheet第一个sheet名为sheet1 * 构造默认写出到第一个sheet第一个sheet名为sheet1
* *
* @param destFilePath 目标文件路径可以不存在 * @param destFilePath 目标文件路径可以不存在
*/ */
public ExcelWriter(String destFilePath) { public ExcelWriter(String destFilePath) {
@ -107,8 +122,8 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 构造<br> * 构造<br>
* 此构造不传入写出的Excel文件路径只能调用{@link #flush(OutputStream)}方法写出到流<br> * 此构造不传入写出的Excel文件路径只能调用{@link #flush(OutputStream)}方法写出到流<br>
* 若写出到文件需要调用{@link #flush(File)} 写出到文件 * 若写出到文件需要调用{@link #flush(File)} 写出到文件
* *
* @param isXlsx 是否为xlsx格式 * @param isXlsx 是否为xlsx格式
* @param sheetName sheet名第一个sheet名并写出到此sheet例如sheet1 * @param sheetName sheet名第一个sheet名并写出到此sheet例如sheet1
* @since 4.1.8 * @since 4.1.8
*/ */
@ -118,9 +133,9 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 构造 * 构造
* *
* @param destFilePath 目标文件路径可以不存在 * @param destFilePath 目标文件路径可以不存在
* @param sheetName sheet名第一个sheet名并写出到此sheet例如sheet1 * @param sheetName sheet名第一个sheet名并写出到此sheet例如sheet1
*/ */
public ExcelWriter(String destFilePath, String sheetName) { public ExcelWriter(String destFilePath, String sheetName) {
this(FileUtil.file(destFilePath), sheetName); this(FileUtil.file(destFilePath), sheetName);
@ -128,7 +143,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 构造默认写出到第一个sheet第一个sheet名为sheet1 * 构造默认写出到第一个sheet第一个sheet名为sheet1
* *
* @param destFile 目标文件可以不存在 * @param destFile 目标文件可以不存在
*/ */
public ExcelWriter(File destFile) { public ExcelWriter(File destFile) {
@ -137,8 +152,8 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 构造 * 构造
* *
* @param destFile 目标文件可以不存在 * @param destFile 目标文件可以不存在
* @param sheetName sheet名做为第一个sheet名并写出到此sheet例如sheet1 * @param sheetName sheet名做为第一个sheet名并写出到此sheet例如sheet1
*/ */
public ExcelWriter(File destFile, String sheetName) { public ExcelWriter(File destFile, String sheetName) {
@ -150,8 +165,8 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 构造<br> * 构造<br>
* 此构造不传入写出的Excel文件路径只能调用{@link #flush(OutputStream)}方法写出到流<br> * 此构造不传入写出的Excel文件路径只能调用{@link #flush(OutputStream)}方法写出到流<br>
* 若写出到文件还需调用{@link #setDestFile(File)}方法自定义写出的文件然后调用{@link #flush()}方法写出到文件 * 若写出到文件还需调用{@link #setDestFile(File)}方法自定义写出的文件然后调用{@link #flush()}方法写出到文件
* *
* @param workbook {@link Workbook} * @param workbook {@link Workbook}
* @param sheetName sheet名做为第一个sheet名并写出到此sheet例如sheet1 * @param sheetName sheet名做为第一个sheet名并写出到此sheet例如sheet1
*/ */
public ExcelWriter(Workbook workbook, String sheetName) { public ExcelWriter(Workbook workbook, String sheetName) {
@ -162,7 +177,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 构造<br> * 构造<br>
* 此构造不传入写出的Excel文件路径只能调用{@link #flush(OutputStream)}方法写出到流<br> * 此构造不传入写出的Excel文件路径只能调用{@link #flush(OutputStream)}方法写出到流<br>
* 若写出到文件还需调用{@link #setDestFile(File)}方法自定义写出的文件然后调用{@link #flush()}方法写出到文件 * 若写出到文件还需调用{@link #setDestFile(File)}方法自定义写出的文件然后调用{@link #flush()}方法写出到文件
* *
* @param sheet {@link Sheet} * @param sheet {@link Sheet}
* @since 4.0.6 * @since 4.0.6
*/ */
@ -189,13 +204,13 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 重置Writer包括 * 重置Writer包括
* *
* <pre> * <pre>
* 1. 当前行游标归零 * 1. 当前行游标归零
* 2. 清空别名比较器 * 2. 清空别名比较器
* 3. 清除标题缓存 * 3. 清除标题缓存
* </pre> * </pre>
* *
* @return this * @return this
*/ */
public ExcelWriter reset() { public ExcelWriter reset() {
@ -206,7 +221,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 重命名当前sheet * 重命名当前sheet
* *
* @param sheetName 新的sheet名 * @param sheetName 新的sheet名
* @return this * @return this
* @since 4.1.8 * @since 4.1.8
@ -217,8 +232,8 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 重命名sheet * 重命名sheet
* *
* @param sheet sheet需要0表示第一个sheet * @param sheet sheet需要0表示第一个sheet
* @param sheetName 新的sheet名 * @param sheetName 新的sheet名
* @return this * @return this
* @since 4.1.8 * @since 4.1.8
@ -232,7 +247,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 设置所有列为自动宽度不考虑合并单元格<br> * 设置所有列为自动宽度不考虑合并单元格<br>
* 此方法必须在指定列数据完全写出后调用才有效<br> * 此方法必须在指定列数据完全写出后调用才有效<br>
* 列数计算是通过第一行计算的 * 列数计算是通过第一行计算的
* *
* @return this * @return this
* @since 4.0.12 * @since 4.0.12
*/ */
@ -247,7 +262,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 设置某列为自动宽度不考虑合并单元格<br> * 设置某列为自动宽度不考虑合并单元格<br>
* 此方法必须在指定列数据完全写出后调用才有效 * 此方法必须在指定列数据完全写出后调用才有效
* *
* @param columnIndex 第几列从0计数 * @param columnIndex 第几列从0计数
* @return this * @return this
* @since 4.0.12 * @since 4.0.12
@ -260,8 +275,8 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 设置某列为自动宽度<br> * 设置某列为自动宽度<br>
* 此方法必须在指定列数据完全写出后调用才有效 * 此方法必须在指定列数据完全写出后调用才有效
* *
* @param columnIndex 第几列从0计数 * @param columnIndex 第几列从0计数
* @param useMergedCells 是否适用于合并单元格 * @param useMergedCells 是否适用于合并单元格
* @return this * @return this
* @since 3.3.0 * @since 3.3.0
@ -270,10 +285,10 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
this.sheet.autoSizeColumn(columnIndex, useMergedCells); this.sheet.autoSizeColumn(columnIndex, useMergedCells);
return this; return this;
} }
/** /**
* 禁用默认样式 * 禁用默认样式
* *
* @return this * @return this
* @see #setStyleSet(StyleSet) * @see #setStyleSet(StyleSet)
* @since 4.6.3 * @since 4.6.3
@ -284,7 +299,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 设置样式集如果不使用样式传入{@code null} * 设置样式集如果不使用样式传入{@code null}
* *
* @param styleSet 样式集{@code null}表示无样式 * @param styleSet 样式集{@code null}表示无样式
* @return this * @return this
* @since 4.1.11 * @since 4.1.11
@ -296,14 +311,14 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 获取样式集样式集可以自定义包括<br> * 获取样式集样式集可以自定义包括<br>
* *
* <pre> * <pre>
* 1. 头部样式 * 1. 头部样式
* 2. 一般单元格样式 * 2. 一般单元格样式
* 3. 默认数字样式 * 3. 默认数字样式
* 4. 默认日期样式 * 4. 默认日期样式
* </pre> * </pre>
* *
* @return 样式集 * @return 样式集
* @since 4.0.0 * @since 4.0.0
*/ */
@ -313,7 +328,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 获取头部样式获取样式后可自定义样式 * 获取头部样式获取样式后可自定义样式
* *
* @return 头部样式 * @return 头部样式
*/ */
public CellStyle getHeadCellStyle() { public CellStyle getHeadCellStyle() {
@ -322,11 +337,11 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 获取单元格样式获取样式后可自定义样式 * 获取单元格样式获取样式后可自定义样式
* *
* @return 单元格样式 * @return 单元格样式
*/ */
public CellStyle getCellStyle() { public CellStyle getCellStyle() {
if(null == this.styleSet){ if (null == this.styleSet) {
return null; return null;
} }
return this.styleSet.cellStyle; return this.styleSet.cellStyle;
@ -334,41 +349,41 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 获得当前行 * 获得当前行
* *
* @return 当前行 * @return 当前行
*/ */
public int getCurrentRow() { public int getCurrentRow() {
return this.currentRow.get(); return this.currentRow.get();
} }
/** /**
* 获取Content-Disposition头对应的值可以通过调用以下方法快速设置下载Excel的头信息 * 获取Content-Disposition头对应的值可以通过调用以下方法快速设置下载Excel的头信息
* *
* <pre> * <pre>
* response.setHeader("Content-Disposition", excelWriter.getDisposition("test.xlsx", CharsetUtil.CHARSET_UTF_8)); * response.setHeader("Content-Disposition", excelWriter.getDisposition("test.xlsx", CharsetUtil.CHARSET_UTF_8));
* </pre> * </pre>
* *
* @param fileName 文件名如果文件名没有扩展名会自动按照生成Excel类型补齐扩展名如果提供空使用随机UUID * @param fileName 文件名如果文件名没有扩展名会自动按照生成Excel类型补齐扩展名如果提供空使用随机UUID
* @param charset 编码null则使用默认UTF-8编码 * @param charset 编码null则使用默认UTF-8编码
* @return Content-Disposition值 * @return Content-Disposition值
*/ */
public String getDisposition(String fileName, Charset charset) { public String getDisposition(String fileName, Charset charset) {
if(null == charset) { if (null == charset) {
charset = CharsetUtil.CHARSET_UTF_8; charset = CharsetUtil.CHARSET_UTF_8;
} }
if(StrUtil.isBlank(fileName)) { if (StrUtil.isBlank(fileName)) {
// 未提供文件名使用随机UUID作为文件名 // 未提供文件名使用随机UUID作为文件名
fileName = IdUtil.fastSimpleUUID(); fileName = IdUtil.fastSimpleUUID();
} }
fileName = StrUtil.addSuffixIfNot(URLUtil.encodeAll(fileName, charset), isXlsx() ? ".xlsx" : ".xls"); fileName = StrUtil.addSuffixIfNot(URLUtil.encodeAll(fileName, charset), isXlsx() ? ".xlsx" : ".xls");
return StrUtil.format("attachment; filename=\"{}\"; filename*={}''{}", fileName, charset.name(), fileName); return StrUtil.format("attachment; filename=\"{}\"; filename*={}''{}", fileName, charset.name(), fileName);
} }
/** /**
* 设置当前所在行 * 设置当前所在行
* *
* @param rowIndex 行号 * @param rowIndex 行号
* @return this * @return this
*/ */
@ -379,7 +394,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 跳过当前行 * 跳过当前行
* *
* @return this * @return this
*/ */
public ExcelWriter passCurrentRow() { public ExcelWriter passCurrentRow() {
@ -389,7 +404,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 跳过指定行数 * 跳过指定行数
* *
* @param rows 跳过的行数 * @param rows 跳过的行数
* @return this * @return this
*/ */
@ -400,7 +415,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 重置当前行为0 * 重置当前行为0
* *
* @return this * @return this
*/ */
public ExcelWriter resetRow() { public ExcelWriter resetRow() {
@ -410,7 +425,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 设置写出的目标文件 * 设置写出的目标文件
* *
* @param destFile 目标文件 * @param destFile 目标文件
* @return this * @return this
*/ */
@ -421,7 +436,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 设置标题别名key为Map中的keyvalue为别名 * 设置标题别名key为Map中的keyvalue为别名
* *
* @param headerAlias 标题别名 * @param headerAlias 标题别名
* @return this * @return this
* @since 3.2.1 * @since 3.2.1
@ -435,7 +450,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 清空标题别名key为Map中的keyvalue为别名 * 清空标题别名key为Map中的keyvalue为别名
* *
* @return this * @return this
* @since 4.5.4 * @since 4.5.4
*/ */
@ -448,7 +463,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 设置是否只保留别名中的字段值如果为true则不设置alias的字段将不被输出false表示原样输出 * 设置是否只保留别名中的字段值如果为true则不设置alias的字段将不被输出false表示原样输出
* *
* @param isOnlyAlias 是否只保留别名中的字段值 * @param isOnlyAlias 是否只保留别名中的字段值
* @return this * @return this
* @since 4.1.22 * @since 4.1.22
@ -460,8 +475,8 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 增加标题别名 * 增加标题别名
* *
* @param name 原标题 * @param name 原标题
* @param alias 别名 * @param alias 别名
* @return this * @return this
* @since 4.1.5 * @since 4.1.5
@ -485,7 +500,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* @return this * @return this
* @since 5.2.5 * @since 5.2.5
*/ */
public ExcelWriter setFreezePane(int rowSplit){ public ExcelWriter setFreezePane(int rowSplit) {
return setFreezePane(0, rowSplit); return setFreezePane(0, rowSplit);
} }
@ -497,16 +512,16 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* @return this * @return this
* @since 5.2.5 * @since 5.2.5
*/ */
public ExcelWriter setFreezePane(int colSplit, int rowSplit){ public ExcelWriter setFreezePane(int colSplit, int rowSplit) {
getSheet().createFreezePane(colSplit, rowSplit); getSheet().createFreezePane(colSplit, rowSplit);
return this; return this;
} }
/** /**
* 设置列宽单位为一个字符的宽度例如传入width为10表示10个字符的宽度 * 设置列宽单位为一个字符的宽度例如传入width为10表示10个字符的宽度
* *
* @param columnIndex 列号从0开始计数-1表示所有列的默认宽度 * @param columnIndex 列号从0开始计数-1表示所有列的默认宽度
* @param width 宽度单位1~256个字符宽度 * @param width 宽度单位1~256个字符宽度
* @return this * @return this
* @since 4.0.8 * @since 4.0.8
*/ */
@ -518,10 +533,10 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
} }
return this; return this;
} }
/** /**
* 设置默认行高值为一个点的高度 * 设置默认行高值为一个点的高度
* *
* @param height 高度 * @param height 高度
* @return this * @return this
* @since 4.6.5 * @since 4.6.5
@ -532,7 +547,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 设置行高值为一个点的高度 * 设置行高值为一个点的高度
* *
* @param rownum 行号从0开始计数-1表示所有行的默认高度 * @param rownum 行号从0开始计数-1表示所有行的默认高度
* @param height 高度 * @param height 高度
* @return this * @return this
@ -552,9 +567,9 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 设置Excel页眉或页脚 * 设置Excel页眉或页脚
* *
* @param text 页脚的文本 * @param text 页脚的文本
* @param align 对齐方式枚举 {@link Align} * @param align 对齐方式枚举 {@link Align}
* @param isFooter 是否为页脚false表示页眉true表示页脚 * @param isFooter 是否为页脚false表示页眉true表示页脚
* @return this * @return this
* @since 4.1.0 * @since 4.1.0
@ -562,26 +577,26 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
public ExcelWriter setHeaderOrFooter(String text, Align align, boolean isFooter) { public ExcelWriter setHeaderOrFooter(String text, Align align, boolean isFooter) {
final HeaderFooter headerFooter = isFooter ? this.sheet.getFooter() : this.sheet.getHeader(); final HeaderFooter headerFooter = isFooter ? this.sheet.getFooter() : this.sheet.getHeader();
switch (align) { switch (align) {
case LEFT: case LEFT:
headerFooter.setLeft(text); headerFooter.setLeft(text);
break; break;
case RIGHT: case RIGHT:
headerFooter.setRight(text); headerFooter.setRight(text);
break; break;
case CENTER: case CENTER:
headerFooter.setCenter(text); headerFooter.setCenter(text);
break; break;
default: default:
break; break;
} }
return this; return this;
} }
/** /**
* 增加下拉列表 * 增加下拉列表
* *
* @param x x坐标列号从0开始 * @param x x坐标列号从0开始
* @param y y坐标行号从0开始 * @param y y坐标行号从0开始
* @param selectList 下拉列表 * @param selectList 下拉列表
* @return this * @return this
* @since 4.6.2 * @since 4.6.2
@ -592,8 +607,8 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 增加下拉列表 * 增加下拉列表
* *
* @param regions {@link CellRangeAddressList} 指定下拉列表所占的单元格范围 * @param regions {@link CellRangeAddressList} 指定下拉列表所占的单元格范围
* @param selectList 下拉列表内容 * @param selectList 下拉列表内容
* @return this * @return this
* @since 4.6.2 * @since 4.6.2
@ -606,10 +621,10 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
final DataValidation dataValidation = validationHelper.createValidation(constraint, regions); final DataValidation dataValidation = validationHelper.createValidation(constraint, regions);
//处理Excel兼容性问题 //处理Excel兼容性问题
if(dataValidation instanceof XSSFDataValidation) { if (dataValidation instanceof XSSFDataValidation) {
dataValidation.setSuppressDropDownArrow(true); dataValidation.setSuppressDropDownArrow(true);
dataValidation.setShowErrorBox(true); dataValidation.setShowErrorBox(true);
}else { } else {
dataValidation.setSuppressDropDownArrow(false); dataValidation.setSuppressDropDownArrow(false);
} }
@ -618,7 +633,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 增加单元格控制比如下拉列表日期验证数字范围验证等 * 增加单元格控制比如下拉列表日期验证数字范围验证等
* *
* @param dataValidation {@link DataValidation} * @param dataValidation {@link DataValidation}
* @return this * @return this
* @since 4.6.2 * @since 4.6.2
@ -631,7 +646,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 合并当前行的单元格<br> * 合并当前行的单元格<br>
* 样式为默认标题样式可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式 * 样式为默认标题样式可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式
* *
* @param lastColumn 合并到的最后一个列号 * @param lastColumn 合并到的最后一个列号
* @return this * @return this
*/ */
@ -643,9 +658,9 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 合并当前行的单元格并写入对象到单元格<br> * 合并当前行的单元格并写入对象到单元格<br>
* 如果写到单元格中的内容非null行号自动+1否则当前行号不变<br> * 如果写到单元格中的内容非null行号自动+1否则当前行号不变<br>
* 样式为默认标题样式可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式 * 样式为默认标题样式可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式
* *
* @param lastColumn 合并到的最后一个列号 * @param lastColumn 合并到的最后一个列号
* @param content 合并单元格后的内容 * @param content 合并单元格后的内容
* @return this * @return this
*/ */
public ExcelWriter merge(int lastColumn, Object content) { public ExcelWriter merge(int lastColumn, Object content) {
@ -656,9 +671,9 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 合并某行的单元格并写入对象到单元格<br> * 合并某行的单元格并写入对象到单元格<br>
* 如果写到单元格中的内容非null行号自动+1否则当前行号不变<br> * 如果写到单元格中的内容非null行号自动+1否则当前行号不变<br>
* 样式为默认标题样式可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式 * 样式为默认标题样式可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式
* *
* @param lastColumn 合并到的最后一个列号 * @param lastColumn 合并到的最后一个列号
* @param content 合并单元格后的内容 * @param content 合并单元格后的内容
* @param isSetHeaderStyle 是否为合并后的单元格设置默认标题样式 * @param isSetHeaderStyle 是否为合并后的单元格设置默认标题样式
* @return this * @return this
* @since 4.0.10 * @since 4.0.10
@ -681,11 +696,11 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 如果写到单元格中的内容非null行号自动+1否则当前行号不变<br> * 如果写到单元格中的内容非null行号自动+1否则当前行号不变<br>
* 样式为默认标题样式可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式 * 样式为默认标题样式可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式
* *
* @param firstRow 起始行0开始 * @param firstRow 起始行0开始
* @param lastRow 结束行0开始 * @param lastRow 结束行0开始
* @param firstColumn 起始列0开始 * @param firstColumn 起始列0开始
* @param lastColumn 结束列0开始 * @param lastColumn 结束列0开始
* @param content 合并单元格后的内容 * @param content 合并单元格后的内容
* @param isSetHeaderStyle 是否为合并后的单元格设置默认标题样式 * @param isSetHeaderStyle 是否为合并后的单元格设置默认标题样式
* @return this * @return this
* @since 4.0.10 * @since 4.0.10
@ -694,7 +709,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
Assert.isFalse(this.isClosed, "ExcelWriter has been closed!"); Assert.isFalse(this.isClosed, "ExcelWriter has been closed!");
CellStyle style = null; CellStyle style = null;
if(null != this.styleSet){ if (null != this.styleSet) {
style = (isSetHeaderStyle && null != this.styleSet.headCellStyle) ? this.styleSet.headCellStyle : this.styleSet.cellStyle; style = (isSetHeaderStyle && null != this.styleSet.headCellStyle) ? this.styleSet.headCellStyle : this.styleSet.cellStyle;
} }
CellUtil.mergingCells(this.sheet, firstRow, lastRow, firstColumn, lastColumn, style); CellUtil.mergingCells(this.sheet, firstRow, lastRow, firstColumn, lastColumn, style);
@ -712,17 +727,17 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 写出的起始行为当前行号可使用{@link #getCurrentRow()}方法调用根据写出的的行数当前行号自动增加<br> * 写出的起始行为当前行号可使用{@link #getCurrentRow()}方法调用根据写出的的行数当前行号自动增加<br>
* 样式为默认样式可使用{@link #getCellStyle()}方法调用后自定义默认样式<br> * 样式为默认样式可使用{@link #getCellStyle()}方法调用后自定义默认样式<br>
* 默认的当当前行号为0时写出标题如果为Map或Bean否则不写标题 * 默认的当当前行号为0时写出标题如果为Map或Bean否则不写标题
* *
* <p> * <p>
* data中元素支持的类型有 * data中元素支持的类型有
* *
* <pre> * <pre>
* 1. Iterable即元素为一个集合元素被当作一行data表示多行<br> * 1. Iterable即元素为一个集合元素被当作一行data表示多行<br>
* 2. Map即元素为一个Map第一个Map的keys作为首行剩下的行为Map的valuesdata表示多行 <br> * 2. Map即元素为一个Map第一个Map的keys作为首行剩下的行为Map的valuesdata表示多行 <br>
* 3. Bean即元素为一个Bean第一个Bean的字段名列表会作为首行剩下的行为Bean的字段值列表data表示多行 <br> * 3. Bean即元素为一个Bean第一个Bean的字段名列表会作为首行剩下的行为Bean的字段值列表data表示多行 <br>
* 4. 其它类型按照基本类型输出例如字符串 * 4. 其它类型按照基本类型输出例如字符串
* </pre> * </pre>
* *
* @param data 数据 * @param data 数据
* @return this * @return this
*/ */
@ -734,18 +749,18 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 写出数据本方法只是将数据写入Workbook中的Sheet并不写出到文件<br> * 写出数据本方法只是将数据写入Workbook中的Sheet并不写出到文件<br>
* 写出的起始行为当前行号可使用{@link #getCurrentRow()}方法调用根据写出的的行数当前行号自动增加<br> * 写出的起始行为当前行号可使用{@link #getCurrentRow()}方法调用根据写出的的行数当前行号自动增加<br>
* 样式为默认样式可使用{@link #getCellStyle()}方法调用后自定义默认样式 * 样式为默认样式可使用{@link #getCellStyle()}方法调用后自定义默认样式
* *
* <p> * <p>
* data中元素支持的类型有 * data中元素支持的类型有
* *
* <pre> * <pre>
* 1. Iterable即元素为一个集合元素被当作一行data表示多行<br> * 1. Iterable即元素为一个集合元素被当作一行data表示多行<br>
* 2. Map即元素为一个Map第一个Map的keys作为首行剩下的行为Map的valuesdata表示多行 <br> * 2. Map即元素为一个Map第一个Map的keys作为首行剩下的行为Map的valuesdata表示多行 <br>
* 3. Bean即元素为一个Bean第一个Bean的字段名列表会作为首行剩下的行为Bean的字段值列表data表示多行 <br> * 3. Bean即元素为一个Bean第一个Bean的字段名列表会作为首行剩下的行为Bean的字段值列表data表示多行 <br>
* 4. 其它类型按照基本类型输出例如字符串 * 4. 其它类型按照基本类型输出例如字符串
* </pre> * </pre>
* *
* @param data 数据 * @param data 数据
* @param isWriteKeyAsHead 是否强制写出标题行Map或Bean * @param isWriteKeyAsHead 是否强制写出标题行Map或Bean
* @return this * @return this
*/ */
@ -766,18 +781,18 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 写出的起始行为当前行号可使用{@link #getCurrentRow()}方法调用根据写出的的行数当前行号自动增加<br> * 写出的起始行为当前行号可使用{@link #getCurrentRow()}方法调用根据写出的的行数当前行号自动增加<br>
* 样式为默认样式可使用{@link #getCellStyle()}方法调用后自定义默认样式<br> * 样式为默认样式可使用{@link #getCellStyle()}方法调用后自定义默认样式<br>
* data中元素支持的类型有 * data中元素支持的类型有
* *
* <p> * <p>
* 1. Map即元素为一个Map第一个Map的keys作为首行剩下的行为Map的valuesdata表示多行 <br> * 1. Map即元素为一个Map第一个Map的keys作为首行剩下的行为Map的valuesdata表示多行 <br>
* 2. Bean即元素为一个Bean第一个Bean的字段名列表会作为首行剩下的行为Bean的字段值列表data表示多行 <br> * 2. Bean即元素为一个Bean第一个Bean的字段名列表会作为首行剩下的行为Bean的字段值列表data表示多行 <br>
* </p> * </p>
* *
* @param data 数据 * @param data 数据
* @param comparator 比较器用于字段名的排序 * @param comparator 比较器用于字段名的排序
* @return this * @return this
* @since 3.2.3 * @since 3.2.3
*/ */
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({"rawtypes", "unchecked"})
public ExcelWriter write(Iterable<?> data, Comparator<String> comparator) { public ExcelWriter write(Iterable<?> data, Comparator<String> comparator) {
Assert.isFalse(this.isClosed, "ExcelWriter has been closed!"); Assert.isFalse(this.isClosed, "ExcelWriter has been closed!");
boolean isFirstRow = true; boolean isFirstRow = true;
@ -802,7 +817,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 本方法只是将数据写入Workbook中的Sheet并不写出到文件<br> * 本方法只是将数据写入Workbook中的Sheet并不写出到文件<br>
* 写出的起始行为当前行号可使用{@link #getCurrentRow()}方法调用根据写出的的行数当前行号自动+1<br> * 写出的起始行为当前行号可使用{@link #getCurrentRow()}方法调用根据写出的的行数当前行号自动+1<br>
* 样式为默认标题样式可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式 * 样式为默认标题样式可使用{@link #getHeadCellStyle()}方法调用后自定义默认样式
* *
* @param rowData 一行的数据 * @param rowData 一行的数据
* @return this * @return this
*/ */
@ -823,14 +838,14 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 写出一行根据rowBean数据类型不同写出情况如下 * 写出一行根据rowBean数据类型不同写出情况如下
* *
* <pre> * <pre>
* 1如果为Iterable直接写出一行 * 1如果为Iterable直接写出一行
* 2如果为MapisWriteKeyAsHead为true写出两行Map的keys做为一行values做为第二行否则只写出一行values * 2如果为MapisWriteKeyAsHead为true写出两行Map的keys做为一行values做为第二行否则只写出一行values
* 3如果为Bean转为Map写出isWriteKeyAsHead为true写出两行Map的keys做为一行values做为第二行否则只写出一行values * 3如果为Bean转为Map写出isWriteKeyAsHead为true写出两行Map的keys做为一行values做为第二行否则只写出一行values
* </pre> * </pre>
* *
* @param rowBean 写出的Bean * @param rowBean 写出的Bean
* @param isWriteKeyAsHead 为true写出两行Map的keys做为一行values做为第二行否则只写出一行values * @param isWriteKeyAsHead 为true写出两行Map的keys做为一行values做为第二行否则只写出一行values
* @return this * @return this
* @see #writeRow(Iterable) * @see #writeRow(Iterable)
@ -866,8 +881,8 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 将一个Map写入到ExcelisWriteKeyAsHead为true写出两行Map的keys做为一行values做为第二行否则只写出一行values<br> * 将一个Map写入到ExcelisWriteKeyAsHead为true写出两行Map的keys做为一行values做为第二行否则只写出一行values<br>
* 如果rowMap为空包括null则写出空行 * 如果rowMap为空包括null则写出空行
* *
* @param rowMap 写出的Map为空包括null则写出空行 * @param rowMap 写出的Map为空包括null则写出空行
* @param isWriteKeyAsHead 为true写出两行Map的keys做为一行values做为第二行否则只写出一行values * @param isWriteKeyAsHead 为true写出两行Map的keys做为一行values做为第二行否则只写出一行values
* @return this * @return this
*/ */
@ -885,16 +900,16 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
} }
// 如果已经写出标题行根据标题行找对应的值写入 // 如果已经写出标题行根据标题行找对应的值写入
if(MapUtil.isNotEmpty(this.headLocationCache)){ if (MapUtil.isNotEmpty(this.headLocationCache)) {
final Row row = RowUtil.getOrCreateRow(this.sheet, this.currentRow.getAndIncrement()); final Row row = RowUtil.getOrCreateRow(this.sheet, this.currentRow.getAndIncrement());
Integer location; Integer location;
for (Entry<?, ?> entry : aliasMap.entrySet()) { for (Entry<?, ?> entry : aliasMap.entrySet()) {
location = this.headLocationCache.get(StrUtil.toString(entry.getKey())); location = this.headLocationCache.get(StrUtil.toString(entry.getKey()));
if(null != location){ if (null != location) {
CellUtil.setCellValue(CellUtil.getOrCreateCell(row, location), entry.getValue(), this.styleSet, false); CellUtil.setCellValue(CellUtil.getOrCreateCell(row, location), entry.getValue(), this.styleSet, false);
} }
} }
} else{ } else {
writeRow(aliasMap.values()); writeRow(aliasMap.values());
} }
return this; return this;
@ -905,7 +920,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 本方法只是将数据写入Workbook中的Sheet并不写出到文件<br> * 本方法只是将数据写入Workbook中的Sheet并不写出到文件<br>
* 写出的起始行为当前行号可使用{@link #getCurrentRow()}方法调用根据写出的的行数当前行号自动+1<br> * 写出的起始行为当前行号可使用{@link #getCurrentRow()}方法调用根据写出的的行数当前行号自动+1<br>
* 样式为默认样式可使用{@link #getCellStyle()}方法调用后自定义默认样式 * 样式为默认样式可使用{@link #getCellStyle()}方法调用后自定义默认样式
* *
* @param rowData 一行的数据 * @param rowData 一行的数据
* @return this * @return this
*/ */
@ -919,7 +934,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 给指定单元格赋值使用默认单元格样式 * 给指定单元格赋值使用默认单元格样式
* *
* @param locationRef 单元格地址标识符例如A11B5 * @param locationRef 单元格地址标识符例如A11B5
* @param value * @param value
* @return this * @return this
* @since 5.1.4 * @since 5.1.4
*/ */
@ -930,9 +945,9 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 给指定单元格赋值使用默认单元格样式 * 给指定单元格赋值使用默认单元格样式
* *
* @param x X坐标从0计数即列号 * @param x X坐标从0计数即列号
* @param y Y坐标从0计数即行号 * @param y Y坐标从0计数即行号
* @param value * @param value
* @return this * @return this
* @since 4.0.2 * @since 4.0.2
@ -945,7 +960,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 为指定单元格创建样式 * 为指定单元格创建样式
* *
* @param x X坐标从0计数即列号 * @param x X坐标从0计数即列号
* @param y Y坐标从0计数即行号 * @param y Y坐标从0计数即行号
* @return {@link CellStyle} * @return {@link CellStyle}
@ -965,7 +980,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* <p> * <p>
* 需要注意的是共享样式会共享同一个{@link CellStyle}一个单元格样式改变全部改变 * 需要注意的是共享样式会共享同一个{@link CellStyle}一个单元格样式改变全部改变
* *
* @param style 单元格样式 * @param style 单元格样式
* @param locationRef 单元格地址标识符例如A11B5 * @param locationRef 单元格地址标识符例如A11B5
* @return this * @return this
* @since 5.1.4 * @since 5.1.4
@ -974,18 +989,18 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
final CellLocation cellLocation = ExcelUtil.toLocation(locationRef); final CellLocation cellLocation = ExcelUtil.toLocation(locationRef);
return setStyle(style, cellLocation.getX(), cellLocation.getY()); return setStyle(style, cellLocation.getX(), cellLocation.getY());
} }
/** /**
* 设置某个单元格的样式<br> * 设置某个单元格的样式<br>
* 此方法用于多个单元格共享样式的情况<br> * 此方法用于多个单元格共享样式的情况<br>
* 可以调用{@link #getOrCreateCellStyle(int, int)} 方法创建或取得一个样式对象 * 可以调用{@link #getOrCreateCellStyle(int, int)} 方法创建或取得一个样式对象
* *
* <p> * <p>
* 需要注意的是共享样式会共享同一个{@link CellStyle}一个单元格样式改变全部改变 * 需要注意的是共享样式会共享同一个{@link CellStyle}一个单元格样式改变全部改变
* *
* @param style 单元格样式 * @param style 单元格样式
* @param x X坐标从0计数即列号 * @param x X坐标从0计数即列号
* @param y Y坐标从0计数即行号 * @param y Y坐标从0计数即行号
* @return this * @return this
* @since 4.6.3 * @since 4.6.3
*/ */
@ -995,9 +1010,23 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
return this; return this;
} }
/**
* 设置行样式
*
* @param y Y坐标从0计数即行号
* @param style 样式
* @return this
* @see Row#setRowStyle(CellStyle)
* @since 5.4.5
*/
public ExcelWriter setRowStyle(int y, CellStyle style) {
getOrCreateRow(y).setRowStyle(style);
return this;
}
/** /**
* 创建字体 * 创建字体
* *
* @return 字体 * @return 字体
* @since 4.1.0 * @since 4.1.0
*/ */
@ -1009,7 +1038,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
* 将Excel Workbook刷出到预定义的文件<br> * 将Excel Workbook刷出到预定义的文件<br>
* 如果用户未自定义输出的文件将抛出{@link NullPointerException}<br> * 如果用户未自定义输出的文件将抛出{@link NullPointerException}<br>
* 预定义文件可以通过{@link #setDestFile(File)} 方法预定义或者通过构造定义 * 预定义文件可以通过{@link #setDestFile(File)} 方法预定义或者通过构造定义
* *
* @return this * @return this
* @throws IORuntimeException IO异常 * @throws IORuntimeException IO异常
*/ */
@ -1020,7 +1049,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 将Excel Workbook刷出到文件<br> * 将Excel Workbook刷出到文件<br>
* 如果用户未自定义输出的文件将抛出{@link NullPointerException} * 如果用户未自定义输出的文件将抛出{@link NullPointerException}
* *
* @param destFile 写出到的文件 * @param destFile 写出到的文件
* @return this * @return this
* @throws IORuntimeException IO异常 * @throws IORuntimeException IO异常
@ -1033,7 +1062,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 将Excel Workbook刷出到输出流 * 将Excel Workbook刷出到输出流
* *
* @param out 输出流 * @param out 输出流
* @return this * @return this
* @throws IORuntimeException IO异常 * @throws IORuntimeException IO异常
@ -1044,8 +1073,8 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 将Excel Workbook刷出到输出流 * 将Excel Workbook刷出到输出流
* *
* @param out 输出流 * @param out 输出流
* @param isCloseOut 是否关闭输出流 * @param isCloseOut 是否关闭输出流
* @return this * @return this
* @throws IORuntimeException IO异常 * @throws IORuntimeException IO异常
@ -1090,9 +1119,10 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
} }
// -------------------------------------------------------------------------- Private method start // -------------------------------------------------------------------------- Private method start
/** /**
* 为指定的key列表添加标题别名如果没有定义key的别名在onlyAlias为false时使用原key * 为指定的key列表添加标题别名如果没有定义key的别名在onlyAlias为false时使用原key
* *
* @param rowMap 一行数据 * @param rowMap 一行数据
* @return 别名列表 * @return 别名列表
*/ */
@ -1118,7 +1148,7 @@ public class ExcelWriter extends ExcelBase<ExcelWriter> {
/** /**
* 获取单例的别名比较器比较器的顺序为别名加入的顺序 * 获取单例的别名比较器比较器的顺序为别名加入的顺序
* *
* @return Comparator * @return Comparator
* @since 4.1.5 * @since 4.1.5
*/ */