Android中利用jxl组件来操作excel

1.支持Excel 95-2000的所有版本,生成Excel 2000标准格式,支持字体、数字、日期操作,能够修饰单元格属性,支持图像和图表,
最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。但是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。

看一下效果图,

Android中利用jxl组件来操作excel_第1张图片

2.首先你需要有一个jxl.jar,在网上下载jxl.jar包,然后在导入你的项目中,

Android中利用jxl组件来操作excel_第2张图片

下面是操作的步骤,
3.创建文件,
例子是生成一个名为“test.xls”的Excel文件,其中第一个工作表被命名为“第一张工作表”。编译执行后,会产生一个Excel文件。

private void craetExcel() {
    try {
        // 打开文件
        WritableWorkbook book = Workbook.createWorkbook(new File("mnt/sdcard/test.xls"));
        // 生成名为“第一张工作表”的工作表,参数0表示这是第一页
        WritableSheet sheet = book.createSheet("第一张工作表", 0);
        // 在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
        // 以及单元格内容为baby
        Label label = new Label(0, 0, "baby");
        // 将定义好的单元格添加到工作表中

        sheet.addCell(label);
        // 生成一个保存数字的单元格,必须使用Number的完整包路径,否则有语法歧义。
        //单元格位置是第二列,第一行,值为123
        jxl.write.Number number = new jxl.write.Number(1, 0, 123);
        sheet.addCell(number);
        //写入数据并关闭
        book.write();
        book.close();

    } catch (WriteException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3.对excel的单元格进行操作,如行高,列宽以及单元格的合并
①行高:

//设置行高,设置第一行高度为100,参数1:行数,参数2:高度
sheet.setRowView(0, 100);

②列宽:

//设置列宽,设置第一列宽度为50,参数1:列数,参数2:宽度
sheet.setColumnView(0, 50);

③合并单元格(可以横向合并,也可以纵向合并):

//合并单元格,参数1:合并的起始列数,参数2:合并的起始行数,参数3:合并的截止列数,参数4:合并的截止行数
//合并第一列第一行到第四列第五行
sheet.mergeCells(0, 0, 3, 4);

但是有一个地方需要注意一下,合并后的单元格不能再次参加合并,否则会触发异常。

4.设置字体、字号、粗细等,功能主要由WritableFont和WritableCellFormat类来负责。
WritableFont有非常丰富的构造子方法,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。
WritableCellFormat类非常重要,通过它可以指定单元格的各种属性,后面的单元格格式化中会有更多描述。


//创建字体,参数1:字体样式,参数2:字号,参数3:粗体
WritableFont font = new WritableFont(WritableFont.createFont("楷体"), 11, WritableFont.BOLD);
WritableCellFormat format = new WritableCellFormat(font);

// 在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
// 以及单元格内容为baby,并将字体等设置添加进去
Label label = new Label(0, 0, "baby", format);

5.设置对齐方式,

//设置对齐方式为水平居中
format.setAlignment(Alignment.CENTRE);
//设置对齐方式为垂直居中
format.setVerticalAlignment(VerticalAlignment.CENTRE);

6.读取excel文件,

private void readExcel() {
    try {
        Workbook workbook = Workbook.getWorkbook(new File("mnt/sdcard/test.xls"));
        //获取第一个工作表的对象
        Sheet sheet = workbook.getSheet(0);
        //获取第一列第一行的的单元格
        Cell cell = sheet.getCell(0, 0);
        //获取单元格中的内容
        String body = cell.getContents();
        Log.d("bb", body);
        //读取数据关闭
        workbook.close();


    } catch (IOException e) {
        e.printStackTrace();
    } catch (BiffException e) {
        e.printStackTrace();
    }
}

我们可以看见程序的输出结果是:baby,
Cell接口的方法还可以获取单元格行、列位置,单元格是否隐藏等属性。具体的参考jxl的API。

7.修改Excel文件,其实就是覆盖之前excel文件,

private void updatExcel() {
    try {
        //获取excel文件
        Workbook workbook = Workbook.getWorkbook(new File("mnt/sdcard/test.xls"));
        //打开文件的副本,并且制定数据写回到原文件
        WritableWorkbook writableWorkbook = Workbook.createWorkbook(new File("mnt/sdcard/test.xls"), workbook);

        //修改工作表的数据
        WritableSheet sheet = writableWorkbook.getSheet(0);
        sheet.addCell(new Label(0, 0, "覆盖单元格内容"));

        //添加一张新的工作表
        WritableSheet sheet1 = writableWorkbook.createSheet("第二张工作表", 1);
        sheet1.addCell(new Label(0, 0, "第二页的数据"));

        //关闭
        writableWorkbook.close();
        workbook.close();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (BiffException e) {
        e.printStackTrace();
    } catch (RowsExceededException e) {
        e.printStackTrace();
    } catch (WriteException e) {
        e.printStackTrace();
    }
}

现在贴出所有的代码:
MainActivity中:


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button chaBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//创建excel文件
        craetExcel();

        chaBtn = (Button) findViewById(R.id.chaBtn);
        chaBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.chaBtn:
               //读取excel文件
                readExcel();
//更新excel文件
                updatExcel();
                break;
        }
    }


    private void craetExcel() {
        try {
            // 打开文件
            WritableWorkbook book = Workbook.createWorkbook(new File("mnt/sdcard/test.xls"));
            // 生成名为“第一张工作表”的工作表,参数0表示这是第一页
            WritableSheet sheet = book.createSheet("第一张工作表", 0);

            //设置行高,设置第一行高度为100,参数1:行数,参数2:高度
            sheet.setRowView(0, 100);
            //设置列宽,设置第一列宽度为50,参数1:列数,参数2:宽度
            sheet.setColumnView(0, 50);

            //合并单元格,参数1:合并的起始列数,参数2:合并的起始行数,参数3:合并的截止列数,参数4:合并的截止行数
            //合并第一列第一行到第四列第五行
            sheet.mergeCells(0, 0, 3, 4);

            //创建字体,参数1:字体样式,参数2:字号,参数3:粗体
            WritableFont font = new WritableFont(WritableFont.createFont("楷体"), 11, WritableFont.BOLD);
            WritableCellFormat format = new WritableCellFormat(font);

            //设置对齐方式为水平居中
            format.setAlignment(Alignment.CENTRE);
            //设置对齐方式为垂直居中
            format.setVerticalAlignment(VerticalAlignment.CENTRE);

            // 在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
            // 以及单元格内容为baby
            Label label = new Label(0, 0, "baby", format);

            // 将定义好的单元格添加到工作表中
            sheet.addCell(label);
            // 生成一个保存数字的单元格,必须使用Number的完整包路径,否则有语法歧义。
            //单元格位置是第二列,第一行,值为123.456
            jxl.write.Number number = new jxl.write.Number(1, 0, 123.456);
            sheet.addCell(number);
            //写入数据并关闭
            book.write();
            book.close();

        } catch (WriteException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void readExcel() {
        try {
            Workbook workbook = Workbook.getWorkbook(new File("mnt/sdcard/test.xls"));
            //获取第一个工作表的对象
            Sheet sheet = workbook.getSheet(0);
            //获取第一列第一行的的单元格
            Cell cell = sheet.getCell(0, 0);
            //获取单元格中的内容
            String body = cell.getContents();
            Log.d("bb", body);
            //读取数据关闭
            workbook.close();


        } catch (IOException e) {
            e.printStackTrace();
        } catch (BiffException e) {
            e.printStackTrace();
        }
    }

    private void updatExcel() {
        try {
            //获取excel文件
            Workbook workbook = Workbook.getWorkbook(new File("mnt/sdcard/test.xls"));
            //打开文件的副本,并且制定数据写回到原文件
            WritableWorkbook writableWorkbook = Workbook.createWorkbook(new File("mnt/sdcard/test.xls"), workbook);

            //修改工作表的数据
            WritableSheet sheet = writableWorkbook.getSheet(0);
            sheet.addCell(new Label(0, 0, "覆盖单元格内容"));

            //添加一张新的工作表
            WritableSheet sheet1 = writableWorkbook.createSheet("第二张工作表", 1);
            sheet1.addCell(new Label(0, 0, "第二页的数据"));

            //关闭
            writableWorkbook.close();
            workbook.close();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (BiffException e) {
            e.printStackTrace();
        } catch (RowsExceededException e) {
            e.printStackTrace();
        } catch (WriteException e) {
            e.printStackTrace();
        }
    }

}

MainActivity的布局文件:



<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.mac.exportexceldemo.MainActivity">

    <Button
        android:id="@+id/chaBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询" />

LinearLayout>

本人菜鸟一个,有什么不对的地方希望大家指出评论,大神勿喷,希望大家一起学习进步!

你可能感兴趣的:(Android)