Android系统直接输出Excel文档

本文介绍如何在Android设备上利用JXL库直接生成Excel文档,包括设置字体格式、合并单元格等高级功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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来了解其具体的用法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值