org.ttzero.excel.entity.Column Maven / Gradle / Ivy
/*
* Copyright (c) 2017-2021, [email protected] All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ttzero.excel.entity;
import org.ttzero.excel.drawing.Effect;
import org.ttzero.excel.entity.style.Border;
import org.ttzero.excel.entity.style.ColorIndex;
import org.ttzero.excel.entity.style.Fill;
import org.ttzero.excel.entity.style.Font;
import org.ttzero.excel.entity.style.Horizontals;
import org.ttzero.excel.entity.style.NumFmt;
import org.ttzero.excel.entity.style.Styles;
import org.ttzero.excel.entity.style.Verticals;
import org.ttzero.excel.manager.Const;
import org.ttzero.excel.processor.ConversionProcessor;
import org.ttzero.excel.processor.Converter;
import org.ttzero.excel.processor.StyleProcessor;
import static org.ttzero.excel.entity.IWorksheetWriter.isBigDecimal;
import static org.ttzero.excel.entity.IWorksheetWriter.isBool;
import static org.ttzero.excel.entity.IWorksheetWriter.isChar;
import static org.ttzero.excel.entity.IWorksheetWriter.isDate;
import static org.ttzero.excel.entity.IWorksheetWriter.isDateTime;
import static org.ttzero.excel.entity.IWorksheetWriter.isDouble;
import static org.ttzero.excel.entity.IWorksheetWriter.isFloat;
import static org.ttzero.excel.entity.IWorksheetWriter.isInt;
import static org.ttzero.excel.entity.IWorksheetWriter.isLocalDate;
import static org.ttzero.excel.entity.IWorksheetWriter.isLocalDateTime;
import static org.ttzero.excel.entity.IWorksheetWriter.isLocalTime;
import static org.ttzero.excel.entity.IWorksheetWriter.isLong;
import static org.ttzero.excel.entity.IWorksheetWriter.isString;
import static org.ttzero.excel.entity.IWorksheetWriter.isTime;
import static org.ttzero.excel.entity.style.Styles.INDEX_BORDER;
import static org.ttzero.excel.entity.style.NumFmt.DATETIME_FORMAT;
import static org.ttzero.excel.entity.style.NumFmt.DATE_FORMAT;
import static org.ttzero.excel.entity.style.NumFmt.TIME_FORMAT;
/**
* Excel列,{@code Column}用于收集列属性将Java实体与Excel列进行映射,
* 多个{@code Column}组成Excel表头行,当前最大支持1024层表头
*
* @author guanquan.wang at 2021-08-29 19:49
*/
public class Column {
/**
* 未实例化的列,可用于在写超出预知范围外的列
*/
public static final Column UNALLOCATED_COLUMN = new Column();
/**
* Java对象中的字段、Map的Key或者SQL语句中的select字段,具体值由工作表类型决定
*/
public String key;
/**
* Excel表头名称,未指定表头名时默认以{@code #key}的值代替
*/
public String name;
/**
* Excel列值的类型,不特殊指定时该类型与Java对象类型一致,它影响最终输出到Excel单元格值的类型和对齐方式
* 默认情况下文本类型左对齐,数字右对齐,日期居中,表头单元格全部居中
*/
public Class> clazz;
/**
* 输出转换器,通常用于将不可读的状态值或枚举值转换为可读的文本输出到Excel
*/
public ConversionProcessor processor;
/**
* 数据转换器,与{@code ConversionProcessor}不同的是这是一个双向转换器,
* 同时{@code Converter}继承{@code ConversionProcessor}接口,当{@code processor}与
* {@code converter}同时存在时前者具有更高的优先级
*/
public Converter> converter;
/**
* 动态样式转换器,可根据单元格的值动态设置单元格或整行样式,通常用于高亮显示某些需要重视的行或单元格
*/
public StyleProcessor styleProcessor;
/**
* 表格体的样式值
*/
public Integer cellStyle;
/**
* 表格头的样式值
*/
public Integer headerStyle;
/**
* 表格体的样式索引, -1表示未设置
*/
protected int cellStyleIndex = -1;
/**
* 表格头的样式索引, -1表示未设置
*/
protected int headerStyleIndex = -1;
/**
* 列宽,表头行高
*/
public double width = -1D,
/**
* 表头行高
*/
headerHeight = -1D;
/**
* 全局样式对象
*/
public Styles styles;
/**
* 表头批注
*/
public Comment headerComment, cellComment;
/**
* 表格体格式化,自定义格式化可以覆写方法{@link NumFmt#calcNumWidth(double, Font)}调整计算
*/
public NumFmt numFmt;
/**
* 列索引,从0开始的数字,0对应Excel的{@code 'A'}列以此类推,-1表示未设置
*/
public int colIndex = -1;
/**
* 多行表头中指向前一个{@code Column}
*
* @since 0.5.1
*/
public Column prev;
/**
* 多行表头中指向后一个{@code Column}
*
* @since 0.5.1
*/
public Column next;
/**
* 多行表头中指向最后一个{@code Column}
*
* @since 0.5.1
*/
public Column tail;
/**
* 实际列索引,它与Excel列号对应,该值通过内部计算而来,请不要在外部修改
*/
public int realColIndex;
/**
* 标志位集合,保存一些简单的标志位以节省空间,对应的位点说明如下
*
*
* Bit | Contents
* ------+---------
* 31, 1 | 自动换行 1位
* 30, 2 | 自适应列宽 2位, 0: auto, 1: auto-size 2: fixed-size
* 28, 1 | 忽略导出值 1位, 仅导出表头
* 27, 1 | 隐藏列 1位
* 26, 1 | 共享字符串 1位
* 25, 2 | 列类型, 0: 默认导出为文本 1: 导出为图片 2: 超链接
* 23, 2 | 垂直对齐
* 21, 3 | 水平对齐
*
*/
protected int option;
/**
* 图片效果,可以简单使用内置的{@link org.ttzero.excel.drawing.PresetPictureEffect} 28种效果
*/
public Effect effect;
/**
* 单元格字体
*/
public Font font;
/**
* 单元格填充
*/
public Fill fill;
/**
* 单元格边框
*/
public Border border;
/**
* 实例化列信息
*/
public Column() { }
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
*/
public Column(String name) {
this.name = name;
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param clazz 数据类型,影响单元格对齐默认字符串左对齐、数字右对齐、日期居中
*/
public Column(String name, Class> clazz) {
this(name, clazz, false);
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param key 取值使用的关键字对应Java对象字段名或者Map的Key
*/
public Column(String name, String key) {
this(name, key, false);
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param key 取值使用的关键字对应Java对象字段名、Map的Key或者SQL中select语句包含的字段
* @param clazz 数据类型,影响单元格对齐默认字符串左对齐、数字右对齐、日期居中
*/
public Column(String name, String key, Class> clazz) {
this(name, key, false);
this.clazz = clazz;
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param clazz 数据类型,影响单元格对齐默认字符串左对齐、数字右对齐、日期居中
* @param processor 输出转换器,动态转换状态值或枚举值为文本
*/
public Column(String name, Class> clazz, ConversionProcessor processor) {
this(name, clazz, processor, false);
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param key 取值使用的关键字对应Java对象字段名、Map的Key或者SQL中select语句包含的字段
* @param processor 输出转换器,动态转换状态值或枚举值为文本
*/
public Column(String name, String key, ConversionProcessor processor) {
this(name, key, processor, false);
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param clazz 数据类型,影响单元格对齐默认字符串左对齐、数字右对齐、日期居中
* @param share 是否将值放到字符串共享区
*/
public Column(String name, Class> clazz, boolean share) {
this.name = name;
this.clazz = clazz;
setShare(share);
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param key 取值使用的关键字对应Java对象字段名、Map的Key或者SQL中select语句包含的字段
* @param share 是否将值放到字符串共享区
*/
public Column(String name, String key, boolean share) {
this.name = name;
this.key = key;
setShare(share);
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param clazz 数据类型,影响单元格对齐默认字符串左对齐、数字右对齐、日期居中
* @param processor 输出转换器,动态转换状态值或枚举值为文本
* @param share 是否将值放到字符串共享区
*/
public Column(String name, Class> clazz, ConversionProcessor processor, boolean share) {
this(name, clazz, share);
this.processor = processor;
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param key 取值使用的关键字对应Java对象字段名、Map的Key或者SQL中select语句包含的字段
* @param clazz 数据类型,影响单元格对齐默认字符串左对齐、数字右对齐、日期居中
* @param processor 输出转换器,动态转换状态值或枚举值为文本
*/
public Column(String name, String key, Class> clazz, ConversionProcessor processor) {
this(name, key, clazz);
this.processor = processor;
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param key 取值使用的关键字对应Java对象字段名、Map的Key或者SQL中select语句包含的字段
* @param processor 输出转换器,动态转换状态值或枚举值为文本
* @param share 是否将值放到字符串共享区
*/
public Column(String name, String key, ConversionProcessor processor, boolean share) {
this(name, key, share);
this.processor = processor;
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param clazz 数据类型,影响单元格对齐默认字符串左对齐、数字右对齐、日期居中
* @param cellStyle 样式值,样式值由背景,边框,字体等进行“或”运算而来
*/
public Column(String name, Class> clazz, int cellStyle) {
this(name, clazz, cellStyle, true);
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param key 取值使用的关键字对应Java对象字段名、Map的Key或者SQL中select语句包含的字段
* @param cellStyle 样式值,样式值由背景,边框,字体等进行“或”运算而来
*/
public Column(String name, String key, int cellStyle) {
this(name, key, cellStyle, true);
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param clazz 数据类型,影响单元格对齐默认字符串左对齐、数字右对齐、日期居中
* @param cellStyle 样式值,样式值由背景,边框,字体等进行“或”运算而来
* @param share 是否将值放到字符串共享区
*/
public Column(String name, Class> clazz, int cellStyle, boolean share) {
this(name, clazz, share);
this.cellStyle = cellStyle;
}
/**
* 实例化列信息
*
* @param name 列名,列名对应Excel表头
* @param key 取值使用的关键字对应Java对象字段名、Map的Key或者SQL中select语句包含的字段
* @param cellStyle 样式值,样式值由背景,边框,字体等进行“或”运算而来
* @param share 是否将值放到字符串共享区
*/
public Column(String name, String key, int cellStyle, boolean share) {
this(name, key, share);
this.cellStyle = cellStyle;
}
/**
* 通过已有列实例化列信息
*
* @param other 其它列
*/
public Column(Column other) {
from(other);
if (other.next != null) addSubColumn(new Column(other.next));
}
/**
* 复制列信息
*
* @param other 其它列
* @return 当前列
*/
public Column from(Column other) {
this.key = other.key;
this.name = other.name;
this.clazz = other.clazz;
this.processor = other.processor;
this.converter = other.converter;
this.styleProcessor = other.styleProcessor;
this.width = other.width;
this.headerHeight = other.headerHeight;
this.styles = other.styles;
this.headerComment = other.headerComment;
this.cellComment = other.cellComment;
this.numFmt = other.numFmt;
this.font = other.font;
this.border = other.border;
this.fill = other.fill;
this.colIndex = other.colIndex;
this.option = other.option;
this.realColIndex = other.realColIndex;
if (other.cellStyle != null) setCellStyle(other.cellStyle);
if (other.headerStyle != null) setHeaderStyle(other.headerStyle);
int i;
if ((i = other.getHeaderStyleIndex()) > 0) this.headerStyleIndex = i;
if ((i = other.getCellStyleIndex()) > 0) this.cellStyleIndex = i;
this.effect = other.effect;
return this;
}
/**
* 设置列宽,当该列同时标记为“自适应列宽”时最终的列宽取两者中的较小值,当列宽设置为{@code 0}时效果与隐藏相同
*
* @param width 列宽,必须大于等于0
* @return 当前列
*/
public Column setWidth(double width) {
if (width < 0) {
throw new ExcelWriteException("Width " + width + " less than 0.");
}
this.width = width;
return this;
}
/**
* 设置行高,最终的行高取所有列最大值,当行高设置为{@code 0}时效果与隐藏相同
*
* @param headerHeight 行高,必须大于等于{@code 0}
* @return 当前列
*/
public Column setHeaderHeight(double headerHeight) {
if (headerHeight < 0) {
throw new ExcelWriteException("Height " + headerHeight + " less than 0.");
}
this.headerHeight = headerHeight;
return this;
}
/**
* 获取是否将字符串放入共享区
*
* @return true: 共享,false:内嵌
*/
public boolean isShare() {
return (option >> 5 & 1) == 1;
}
/**
* 获取列名,列名对应Excel表头
*
* @return 列名
*/
public String getName() {
return name;
}
/**
* 设置表头列名
*
* @param name 表头列名
* @return 当前列
*/
public Column setName(String name) {
this.name = name;
return this;
}
/**
* 获取列数据类型
*
* @return 数据行的数据类型
*/
public Class> getClazz() {
return clazz;
}
/**
* 设置列数据类型,数据影响单元格对齐,默认字符串左对齐、数字右对齐、日期居中
*
* @param clazz 列数据类型
* @return 当前列
*/
public Column setClazz(Class> clazz) {
this.clazz = clazz;
return this;
}
/**
* 设置输出转换器,通常用于动态转换状态值或枚举值为文本
*
* @param processor 输出转换器
* @return 当前列
*/
public Column setProcessor(ConversionProcessor processor) {
this.processor = processor;
return this;
}
/**
* 设置动态样式转换器,通常用于高亮显示单元格起提醒作用
*
* @param styleProcessor 样式转换器
* @return 当前列
*/
public Column setStyleProcessor(StyleProcessor styleProcessor) {
if (styleProcessor != null && !StyleProcessor.None.class.isAssignableFrom(styleProcessor.getClass())) {
this.styleProcessor = styleProcessor;
}
return this;
}
/**
* 获取输出转换器,优先返回{@code ConversionProcessor},其次是{@code Converter}
*
* @return 值转换器
*/
public ConversionProcessor getConversion() {
return processor != null ? processor : converter;
}
/**
* 设置转换器,导出的时候将状态值或枚举值转为文本,导入的时候将文本转为状态或枚举值
*
* @param converter 值转换器
* @return 当前列
*/
public Column setConverter(Converter> converter) {
if (converter != null && !Converter.None.class.isAssignableFrom(converter.getClass())) {
this.converter = converter;
}
return this;
}
/**
* 获取列宽,这里仅返回通过{@link #setWidth}设置的列宽不包含自适应列宽,自适应列宽通常是在导出的时候动态计算
*
* @return 当前列宽,未设置时返回{@code -1}
*/
public double getWidth() {
return width;
}
/**
* 设置单元格样式值,样式值由背景,边框,字体等进行“或”运算而来
*
* @param cellStyle 样式值
* @return 当前列
*/
public Column setCellStyle(int cellStyle) {
this.cellStyle = cellStyle;
if (styles != null) this.cellStyleIndex = styles.of(cellStyle);
return this;
}
/**
* 设置表头单元格样式值,样式值由背景,边框,字体等进行“或”运算而来
*
* @param headerStyle 样式值
* @return 当前列
*/
public Column setHeaderStyle(int headerStyle) {
this.headerStyle = headerStyle;
if (styles != null) this.headerStyleIndex = styles.of(headerStyle);
return this;
}
/**
* 设置列下标,下标从{@code 0}开始对应Excel的{@code A}列,这里设置的下标是绝对位置,
* 如果表头下标不连续那么导出的时候列也是不连续的
*
* @param colIndex 从0开始的列号
* @return 当前列
*/
public Column setColIndex(int colIndex) {
this.colIndex = colIndex;
return this;
}
/**
* 获取单元格样式索引,不包含动态样式
*
* @return 单元格样式索引,未设置样式时返回{@code -1}
*/
public int getCellStyleIndex() {
return cellStyleIndex >= 0 ? cellStyleIndex : (cellStyleIndex = styles != null && cellStyle != null ? styles.of(cellStyle) : -1);
}
/**
* 获取表头单元格样式索引,不包含动态样式
*
* @return 表头单元格样式索引,未设置样式时返回{@code -1}
*/
public int getHeaderStyleIndex() {
return headerStyleIndex >= 0 ? headerStyleIndex : (headerStyleIndex = styles != null && headerStyle != null ? styles.of(headerStyle) : -1);
}
/**
* 设置当前列统一“字体”样式
*
* @param font 字体
* @return 当前列
*/
public Column setFont(Font font) {
this.font = font;
return this;
}
/**
* 设置当前列统一“填充”样式
*
* @param fill 填充
* @return 当前列
*/
public Column setFill(Fill fill) {
this.fill = fill;
return this;
}
/**
* 设置当前列统一“边框”样式
*
* @param border 边框
* @return 当前列
*/
public Column setBorder(Border border) {
this.border = border;
return this;
}
/**
* 设置当前列统一“垂直对齐”样式
*
* @param vertical 垂直对齐,参考值{@link Verticals}
* @return 当前列
*/
public Column setVertical(int vertical) {
option = (option & ~(3 << 8)) | (((vertical >> Styles.INDEX_VERTICAL) & 3) << 8);
return this;
}
/**
* 设置当前列统一“水平对齐”样式
*
* @param horizontal 水平对齐,参考值{@link Horizontals}
* @return 当前列
*/
public Column setHorizontal(int horizontal) {
option = (option & ~(7 << 10)) | (((horizontal >> Styles.INDEX_HORIZONTAL) & 7) << 10);
return this;
}
/**
* 设置共享字符串标记,当此标记为{@code true}时单元格的字符串将独立保存在共享区
*
* @param share true: 共享, false: 内嵌
* @return 当前列
*/
public Column setShare(boolean share) {
if (share) this.option |= 1 << 5;
else this.option &= ~(1 << 5);
return this;
}
/**
* 设置当前列统一“格式化”样式
*
* @param code 格式化串
* @return 当前列
*/
public Column setNumFmt(String code) {
this.numFmt = new NumFmt(code);
return this;
}
/**
* 设置当前列统一“格式化”样式
*
* @param numFmt 格式化{@link NumFmt}
* @return 当前列
*/
public Column setNumFmt(NumFmt numFmt) {
this.numFmt = numFmt;
return this;
}
/**
* 获取当前列统一“格式化”,仅返回通过{@link #setNumFmt}设置的统一值,不包含动态样式
*
* @return 格式化 {@link NumFmt}
*/
public NumFmt getNumFmt() {
return numFmt != null ? numFmt : (numFmt = styles.getNumFmt(cellStyle));
}
/**
* 获取单元格默认样式,通常该方法仅初始化时被调用一次
*
* @param clazz 列数据类型
* @return 样式值
*/
protected int getCellStyle(Class> clazz) {
int style;
if (isString(clazz)) {
style = Styles.defaultStringBorderStyle();
} else if (isDateTime(clazz) || isDate(clazz) || isLocalDateTime(clazz)) {
if (numFmt == null) numFmt = DATETIME_FORMAT;
style = (1 << Styles.INDEX_FONT) | (1 << INDEX_BORDER) | Horizontals.CENTER;
} else if (isBool(clazz) || isChar(clazz)) {
style = Styles.clearHorizontal(Styles.defaultStringBorderStyle()) | Horizontals.CENTER;
} else if (isInt(clazz) || isLong(clazz)) {
style = Styles.defaultIntBorderStyle();
} else if (isFloat(clazz) || isDouble(clazz) || isBigDecimal(clazz)) {
style = Styles.defaultDoubleBorderStyle();
} else if (isLocalDate(clazz)) {
if (numFmt == null) numFmt = DATE_FORMAT;
style = (1 << Styles.INDEX_FONT) | (1 << INDEX_BORDER) | Horizontals.CENTER;
} else if (isTime(clazz) || isLocalTime(clazz)) {
if (numFmt == null) numFmt = TIME_FORMAT;
style = (1 << Styles.INDEX_FONT) | (1 << INDEX_BORDER) | Horizontals.CENTER;
} else {
style = (1 << Styles.INDEX_FONT) | (1 << INDEX_BORDER); // Auto-style
}
return style;
}
/**
* 获取单元格样式值,导出过程中通常只计算一次通用样式,计算完后值将保存在{@code cellStyle}中,
* 默认样式做为底色外部设置的“字体”,“填充”等样式将覆盖默认样式,
*
* @return 样式值
*/
public int getCellStyle() {
if (cellStyle != null) return cellStyle;
// 获取默认样式
int style = getCellStyle(clazz);
// 重置"字体"
if (font != null) style = styles.modifyFont(style, font);
// 超连接字体特殊处理
if (getColumnType() == 2) {
Font font = styles.getFont(style).clone();
font.setStyle(Font.Style.PLAIN).underline();
font.setColor(ColorIndex.themeColors[10]);
style = styles.modifyFont(style, font);
}
// 重置“格式化”
if (numFmt != null) style = styles.modifyNumFmt(style, numFmt);
// 重置“边框”
if (border != null) style = styles.modifyBorder(style, border);
// 重置“填充”
if (fill != null) style = styles.modifyFill(style, fill);
// 重置“垂直对齐”
int v = ((option >>> 8) & 3) << Styles.INDEX_VERTICAL;
if (v > 0) style = styles.modifyVertical(style, v);
// 重置“水平对齐”
int h = ((option >>> 10) & 7) << Styles.INDEX_HORIZONTAL;
if (h > 0) style = styles.modifyHorizontal(style, h);
// 重置“自动折行”
style |= (option & 1);
// 保存样式
setCellStyle(style);
return style;
}
/**
* 是否忽略数据
*
* @return true: 忽略数据只输出表头
*/
public boolean isIgnoreValue() {
return (option >> 3 & 1) == 1;
}
/**
* 忽略{@code Body}的数据只输出表头
*
* @return 当前列
*/
public Column ignoreValue() {
this.option |= 1 << 3;
return this;
}
/**
* 设置“自动折行”
*
* 折行触发条件:一是当长度超过列宽时折行,二是包含回车符时折行
*
* @param wrapText 自动折行
* @return 当前列
*/
public Column setWrapText(boolean wrapText) {
if (wrapText) this.option |= 1;
else this.option = option >>> 1 << 1;
return this;
}
/**
* 设置表头批注
*
* @param headerComment 批注{@link Comment}
* @return 当前列
*/
public Column setHeaderComment(Comment headerComment) {
this.headerComment = headerComment;
return this;
}
/**
* 在尾部添加表头
*
* @param column 表头
* @return 当前列
*/
public Column addSubColumn(Column column) {
if (this == column) return this;
if (next != null) {
int subSize = subColumnSize(), appendSize = column.subColumnSize();
if (subSize + appendSize > Const.Limit.HEADER_SUB_COLUMNS) {
throw new ExcelWriteException("Too many sub-column occur. Max support " + Const.Limit.HEADER_SUB_COLUMNS + ", current is " + subSize);
}
column.prev = this.tail;
this.tail.next = column;
} else {
this.next = column;
column.prev = this;
}
this.tail = column.tail != null ? column.tail : column;
return this;
}
/**
* 获取表头行数,单表头返回1,多表头时返回表头行数
*
* @return 表头行数
*/
public int subColumnSize() {
int i = 1;
if (next != null) {
Column next = this.next;
for (; next != tail; next = next.next, i++);
i++;
}
return i;
}
/**
* 多表头时将链表转为数组
*
* @return 表头
*/
public Column[] toArray() {
int len = subColumnSize();
Column[] dist = new Column[len];
if (len < 1) return dist;
Column e = this;
for (int i = 0; i < len; i++) {
dist[i] = e;
e = e.next;
}
return dist;
}
/**
* 获取列在Excel中的实际位置(从{@code A}开始)
*
* @return 列在Excel中的实际位置
*/
public int getRealColIndex() {
return realColIndex;
}
/**
* 判断当前列是否“隐藏”
*
* @return true: 隐藏
*/
public boolean isHide() {
return (option >> 4 & 1) == 1;
}
/**
* 隐藏当前列
*
* @return 当前列
*/
public Column hide() {
this.option |= 1 << 4;
return this;
}
/**
* 标记当前列可见(默认可见)
*
* @return 当前列
*/
public Column show() {
this.option &= ~(1 << 4);
return this;
}
/**
* 获取尾列,Excel从上到下记为首-尾列,尾列为最接近表格体{@code Body}的列
*
* @return 尾列
*/
public Column getTail() {
return tail != null ? tail : this;
}
/**
* 标记“自适应”列宽,导出时根据单元格内容动态计算列宽
*
* @return 当前列
*/
public Column autoSize() {
this.option |= 1 << 1;
return this;
}
/**
* 设置固定列宽
*
* @param width 列宽,必须大于等于0
* @return 当前列
*/
public Column fixedSize(double width) {
this.option |= 1 << 2;
this.width = width;
return this;
}
/**
* 获取列宽属性
*
* @return 0: 未设置 1: 自适应列宽 2: 固定列宽
*/
public int getAutoSize() {
return option >> 1 & 3;
}
/**
* 指定当前列以“值”类型导出
*
* @return 当前列
*/
public Column writeAsDefault() {
this.option &= ~(3 << 6);
return this;
}
/**
* 指定当前列以“媒体”类型导出
*
* @return 当前列
*/
public Column writeAsMedia() {
this.option = this.option & ~(3 << 6) | (1 << 6);
return this;
}
/**
* 获取列属性
*
* @return 0: 默认 1: 媒体(图片) 2: 超链接
*/
public int getColumnType() {
return (this.option >> 6) & 3;
}
/**
* 设置当前列全局图片效果,只有当{@code columnType}为{@code Media}时生效
*
* @param effect 图片效果{@link Effect}
* @return 当前列
*/
public Column setEffect(Effect effect) {
this.effect = effect;
return this;
}
/**
* 获取当前列设置的图片效果
*
* @return 图片效果 {@link Effect}
*/
public Effect getEffect() {
return effect;
}
/**
* 指定当前列以“超链接”类型导出
*
* @return 当前列
*/
public Column writeAsHyperlink() {
this.option = this.option & ~(3 << 6) | (2 << 6);
return this;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy