Android系统直接输出Excel文档
一、背景
- 以前Android设备只具备生成txt的能力,数据内容不直观,可读性较差,如果需要Excel文档数据,通常要通过PC软件来进行二次封装和转化,步骤多且繁琐。
- 随着生产过程的深入,越来越需要Android设备直接转化并产出Excel类型文档,提高效率和准确性。
- 鉴于以上问题,我们尝试引入WEB端常用的处理Excel表格的解决方案
JXL
的使用。
二、JXL的特点
- 一个轻量级的JS插件用于创建与Excel兼容并基于WEB的交互式表格和电子表格
- 读取和写入Excel电子表格数据
- 生成Excel格式的电子表格数据
- 支持对字体,数字,日期的格式化
- 支持对单元格加阴影和加色彩
- 修改存在的工作表
- 支持图片的创建
- 日志记录可以定制
三、JXL在Android端如何引入
implementation group: 'net.sourceforge.jexcelapi', name: 'jxl', version: '2.6.12'
api 'net.sourceforge.jexcelapi:jxl:2.6.12'
四、JXL介绍
-
主要API介绍
- Workbook:读工作簿
- WritableWorkbook:写工作簿
- Sheet:读工作表
- WritableSheet:写工作表
- Cell:读单元格
- WritableCell:写单元格
- Label:单元格内容
-
应用
excel文件由一个工作簿(Workbook)组成,工作簿由工作表(sheet)组成,每个工作表又由很多单元格(cell)组成- WritableFont:文本输入的格式
// 字体 ARIAL, 字号 14 bold 粗体 WritableFont arial14font = new WritableFont(WritableFont.ARIAL, 14, BOLD); // 字体的颜色 arial14font.setColour(Colour.BLACK); //设置下划线 arial14font.setUnderlineStyle(UnderlineStyle.SINGLE);
- WritableCellFormat:单元格输入的格式
WritableCellFormat arial14format = new WritableCellFormat(arial14font); // 水平对齐方式 arial14format.setAlignment(Alignment.CENTRE); // 垂直对齐方式 arial14format.setVerticalAlignment(VerticalAlignment.CENTRE); // 边框的格式 arial14format.setBorder(Border.ALL, BorderLineStyle.THIN); // 底色 arial14format.setBackground(Colour.VERY_LIGHT_YELLOW);
- getWorkbook:得到工作簿对象
- createWorkbook:创建一个工作簿对象
第一个参数是必须的:文件或输入流,第二个参数:工作簿是作为读出来的excel的一些约定,如地区,编码等. - createSheet:创建工作表
- getSheet:获取工作表对象
- mergeCells:合并单元格
包含起始第几行、第几列,终到第几行、第几列 - addCell:新增单元格
- new Label():创建单元格内容
包含第几行、第几列、文本内容、格式等入参 - setRowView:设置行
- setColumnView:设置列
五、调用示例
/**
* 生成excel
*/
public boolean toTempReviewExcel(OutputStream excelStream, List<?> dataList) throws Exception {
if (dataList == null || dataList.size() == 0) {
return false;
}
// 通过自定义注解获取工作表名称和工作区域信息
Class<?> dataType = dataList.get(0).getClass();
String sheetName = getSheetName(dataType);
List<ExcelClassKey> keys = getKeys(dataType);
WritableWorkbook workbook = null;
try {
// 创建一个工作簿
workbook = Workbook.createWorkbook(excelStream);
// 创建一个工作表,位置第一个
WritableSheet sheet = workbook.createSheet(sheetName, 0);
// 第一行内容,合并单元格第1行和第2行,以及第1列和第21列
sheet.mergeCells(0, 0, 22, 1);
sheet.addCell(new Label(0, 0, sheetName, arial14format));
// 添加title
for (int x = 0; x < keys.size(); x++) {
// 合并相邻单元格
if (keys.get(x).getIndex() < 2) {
sheet.addCell(new Label(x, 8, keys.get(x).getTitle(), arial12format));
} else if (keys.get(x).getIndex() == 2) {
sheet.mergeCells(x, 8, x + 1, 8); // 合并单元格
sheet.addCell(new Label(x, 8, keys.get(x).getTitle(), arial12format));
} else {
sheet.addCell(new Label(x + 2, 8, keys.get(x).getTitle(), arial12format));
}
// 设置行高500
sheet.setRowView(8, 500);
}
fieldCache.clear();
// 添加数据
for (int y = 0; y < dataList.size(); y++) {
for (int x = 0; x < keys.size(); x++) {
String fieldName = keys.get(x).getFieldName();
Field field = getField(dataType, fieldName);
Object value = field.get(dataList.get(y));
String content = value != null ? value.toString() : "";
// 合并相邻单元格
if (keys.get(x).getIndex() < 2) {
sheet.addCell(new Label(x, y + 9, content, arial12format));
} else if (keys.get(x).getIndex() == 2) {
sheet.mergeCells(x, y + 9, x + 1, y + 9);
sheet.addCell(new Label(x, y + 9, content, arial12format));
} else {
sheet.addCell(new Label(x + 2, y + 9, content, arial12format));
}
// 设置行高500
sheet.setRowView(y + 9, 500);
}
}
} catch (Exception e) {
throw e;
} finally {
if (workbook != null) {
try {
workbook.write();
// IO操作需要关闭
workbook.close();
} catch (IOException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
try {
// IO操作需要关闭
excelStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
六、总结
- IO操作需要close()
- 每次createWorkbook的操作,相关格式样式需要重新创建
- 合并和操作单元格需要知道确切的位置信息(第几行、第几列)
- JXL同样支持读物Excel数据,并转化为常用的数据结构,前提是按照表格创建的规则读取
- JXL还提供了复制工作表,复制单元格等操作,可以通过查询API来了解其具体的用法