使用注解很简单,只要在对应的实体类上面加上注解即可。
也就是说使用实体类模型来读写Excel文件时,可以通过注解来控制实体类字段和Excel列之间的对应关系。
ExcelProperty注解用于匹配excel和实体类字段之间的关系。
可以作用于字段上。
| 名称 | 默认值 | 描述 |
|---|---|---|
| value | 空 | 用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头 |
| order | Integer.MAX_VALUE | 优先级高于value,会根据order的顺序来匹配实体和excel中数据的顺序 |
| index | -1 | 优先级高于value和order,会根据index直接指定到excel中具体的哪一列 |
| converter | 自动选择 | 指定当前字段用什么转换器,默认会自动选择。写的情况下只要实现com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext) 方法即可 |
@Getter
@Setter
@EqualsAndHashCode
public class DemoData {
@ExcelProperty("字符串标题")
private String title;
// 在这个字段前面加上 自定义三个字
@ExcelProperty(value = "conver的使用", converter = CustomStringStringConverter.class)
private String convert;
@ExcelProperty(value = "日期标题", index = 3)
private Date date;
@ExcelProperty(value = "数字标题", index = 5)
private Double doubleData;
}
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ReadConverterContext;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.WriteCellData;
/**
* 定义一个字符串转换器,需要实现Converter接口并且传递需要转换的泛型
*/
public class CustomStringStringConverter implements Converter<String> {
// 所支持的java类型
@Override
public Class<?> supportJavaTypeKey() {
return String.class;
}
// 所支持的Excel枚举类型
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 这里读的时候会调用
* @param context 上下文对象 可以获取当前读的单元格的文字内容
* @return 格式化后的值
*/
@Override
public String convertToJavaData(ReadConverterContext<?> context) {
return "自定义:" + context.getReadCellData().getStringValue();
}
/**
* 这里是写的时候会调用 通常情况可以不用管
* @return
*/
@Override
public WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) {
return new WriteCellData<>(context.getValue());
}
}
注意点:
1)关于index
如果所有字段都不加index的话,默认index会从0开始,最早的声明的字段的名字的index的值就是0。
之后字段的index就从0开始递增,依次类推。index是几决定了该字段数据会赋值给Excel中的第几列。
如果不想按这个顺序把数据写到Excel当中。那么就可以手动设置index的值,把字段写到想要的列中去。
如果index相同,直接会抛出异常,因为程序无法判断这个列放那个字段。
2)关于order
index和order虽然都决定顺序,但是两者语义不同:
如果order和index同时使用,index优先占据位置,order再进行排序。
index=-1的话,使用jJava进行默认排序。
order的默认值为Integer.MAX_VALUE,其中order的值越小,列越靠前。
默认所有字段都会和excel中对应列去匹配,但是加了这个注解EasyExcel会忽略该字段,使之不写入Excel。
可以作用于字段上。
@Getter
@Setter
@EqualsAndHashCode
public class DemoData {
// 忽略这个字段,不写入Excel当中
@ExcelIgnore
private String ignore;
}
默认不管加不加ExcelProperty的注解的所有字段都会参与读写。
加了@ExcelIgnoreUnannotated注解以后,不加ExcelProperty注解的字段就不会参与读写。
看起来和@ExcelIgnore注解作用类似,只是用法不同。
可以作用于类上。
@data
@ExcelIgnoreUnannotated
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
private String ignore;
}
日期转换,用String去接收excel日期格式的数据会调用这个注解,参数如下:
可以作用于字段上。
| 名称 | 默认值 | 描述 |
|---|---|---|
| value | 空 | 参照java.text.SimpleDateFormat书写即可 |
| use1904windowing | 自动选择 | excel中时间是存储1900年起的一个双精度浮点数。 但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始 |
不写use1904windowing这个参数默认就是1900的时间格式,一般也就是使用1900的时间格式
@data
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
@ExcelProperty("日期标题")
private Date date;
}
数字转换,用String去接收excel数字格式的数据会调用这个注解。
可以作用于字段上。
| 名称 | 默认值 | 描述 |
|---|---|---|
| value | 空 | 参照java.text.DecimalFormat书写即可 |
| roundingMode | RoundingMode.HALF_UP | 格式化的时候设置舍入模式 |
@data
@ExcelIgnoreUnannotated
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@NumberFormat("#.##%") // 使用百分比格式格式化这个数字
@ExcelProperty("数字")
private Double doubleData;
}
设置列宽度。
可以作用于类或者字段上。
@ColumnWith 只有一个参数value,value的单位是字符长度,最大可以设置255个字符。
因为一个excel单元格最大可以写入的字符个数就是255个字符。
@data
public class DemoData {
@ExcelProperty("字符串标题")
@ColumnWidth(15) //设置列宽为15个字符
private String string;
}
注解作用于类上将会设置全部单元格的宽度为15
注解作用于字段上会设置字段所对应的Excel列的宽度为15
用于设置行高。
可以作用于类上。
只有一个参数value,它的值是Excel文件中的行高。值为-1时代表自动设置行高。
@data
@ContentRowHeight(15)
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
}
ContentFontStyle:用于设置单元格内容字体格式的注解
HeadFontStyle :设置标题的字体样式。
都可以作用于类或者字段上,注解参数也完全一致。
| 名称 | 默认值 | 描述 |
|---|---|---|
| fontName | “” | 字体名称 |
| fontHeightInPoints | -1 | 字体高度 |
| italic | BooleanEnum.DEFAULT | 是否斜体 |
| strikeout | BooleanEnum.DEFAULT | 是否设置删除水平线 |
| color | -1 | 字体颜色 |
| typeOffset | -1 | 偏移量 |
| underline | -1 | 是否添加下划线 |
| bold | -1 | 是否加粗 |
| charset | BooleanEnum.DEFAULT | 编码格式 |
@data
public class DemoData {
// 设置当前列的字体颜色为10(红色) 字体为斜体
@ContentFontStyle(color = 10, italic = BooleanEnum.TRUE)
@ExcelProperty("字符串标题")
private String string;
}
这里的颜色值可以在IndexedColors.RED这个枚举中找到。
如果是使用代码可以直接IndexedColors.RED.getIndex()设置颜色值,注解的话,只能直接写数字
ContentStyle:设置单元格内容样式注解。
HeadStyle :设置标题样式。
都可以作用于类或者字段上,注解参数也完全一致。
| 名称 | 默认值 | 描述 |
|---|---|---|
| dataFormat | -1 | 数据格式 |
| hidden | BooleanEnum.DEFAULT | 设置单元格隐藏 |
| locked | BooleanEnum.DEFAULT | 设置单元格使用此样式锁定 |
| quotePrefix | BooleanEnum.DEFAULT | 设在单元格前面增加`符号,数字或公式将以字符串形式展示 |
| horizontalAlignment | HorizontalAlignmentEnum.DEFAULT | 设置是否水平居中 |
| wrapped | BooleanEnum.DEFAULT | 设置文本是否应换行。将此标志设置为true通过在多行上显示使单元格中的所有内容可见 |
| verticalAlignment | VerticalAlignmentEnum.DEFAULT | 设置是否垂直居中 |
| rotation | -1 | 设置单元格中文本旋转角度。03版本的Excel旋转角度区间为-90°90°,07版本的Excel旋转角度区间为0°180° |
| indent | -1 | 设置单元格中缩进文本的空格数 |
| borderLeft | BorderStyleEnum.DEFAULT | 设置左边框的样式 |
| borderRight | BorderStyleEnum.DEFAULT | 设置右边框样式 |
| borderTop | BorderStyleEnum.DEFAULT | 设置上边框样式 |
| borderBottom | BorderStyleEnum.DEFAULT | 设置下边框样式 |
| leftBorderColor | -1 | 设置左边框颜色 |
| rightBorderColor | -1 | 设置右边框颜色 |
| topBorderColor | -1 | 设置上边框颜色 |
| bottomBorderColor | -1 | 设置下边框颜色 |
| fillPatternType | FillPatternTypeEnum.DEFAULT | 设置填充类型 |
| fillBackgroundColor | -1 | 设置背景色 |
| fillForegroundColor | -1 | 设置前景色 |
| shrinkToFit | BooleanEnum.DEFAULT | 设置自动单元格自动大小 |
@data
public class DemoData {
// 设置单元格的左边框颜色为10(红色) 数据格式为0.00
@ContentStyle(leftBorderColor = 10, dataFormat = 0.00)
@ExcelProperty("字符串标题")
private String string;
}
这里的颜色值可以在IndexedColors.RED这个枚举中找到。
数据格式的值可以在类com.alibaba.excel.constant.BuiltinFormats的字段BUILTIN_FORMATS_CN中找到
用于合并单元格。
可以作用于字段上。
| 名称 | 默认值 | 描述 |
|---|---|---|
| eachRow | 1 | 用于设置当前列每隔几行合并一次单元格 |
| columnExtend | 1 | 用于合并列 |
@data
public class DemoData {
// 单前列每隔两行合并一次单元格
@ContentLoopMerge(eachRow = 2)
@ExcelProperty("字符串标题")
private String string;
}
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
路由有如下代码:resources:orders,only:[:create],defaults:{format:'json'}resources:users,only:[:create,:update],defaults:{format:'json'}resources:delivery_types,only:[:index],defaults:{format:'json'}resources:time_corrections,only:[:index],defaults:{format:'json'}是否可以使用1个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。
我刚刚按照thebootsygempage上的安装说明进行操作在我保存并查看帖子内容之前,一切看起来都不错。这是输出在View中的样子:HeaderSubhead:似乎没有呈现任何html格式,因为它被引号或类似的东西转义了-其他人有这个问题吗?我没有在github页面或SO上看到任何问题来指出我正确的方向。除了遵循gem安装说明之外,我还没有做任何事情,但也许我错过了什么或者只是犯了一个愚蠢的错误。如果你还有什么想知道的,请尽管问。干杯 最佳答案 你需要有这样的东西,转义html: 关