功能:需要将一个实例存入一个指定的Excel表中。
要求:只需要调用一个方法,传入一个实例就可实现。
思路:存入要使用异步操作,要自定义一个Task,重写对应实体的构造方法,在doInBackground中将实例的各个属性值存入对应的Excel表中。
实现步骤:
1.准备好实体,写好实体的构造函数及get/set方法;
2.定义一个Task继承AsyncTask;
2.1定义一个内部类,用于接收实例的属性及在Excel表中的行列值;
2.2重写对应实例的构造函数;
2.3定义将实例属性与对应行列值生成ArrayList<CurCell>的方法;
2.4在doInBackground中执行方法将实例的各个属性值存入对应的Excel表中。
重点:存入对应的Excel表中的方法
1.判断指定路径文件是否存在,如果不存在则新建。
File file = new File("/mnt/sdcard/"+sheetName+".xls");
if (!file.exists())
{// EXL文件不存在,新建
file.createNewFile();
}
2.获取Workbook,创建sheet,sheetName为表头,0为表的位置。
WritableWorkbook mWorkbook = Workbook.createWorkbook(file);
WritableSheet mSheet = mWorkbook.createSheet(sheetName, 0);
3.遍历生成的ArrayList<CurCell> 赋值给Label,Label指表格中的单元格。
for(CurCell mCurCell : mArrayList){
Label mLabel = new Label(mCurCell.col, mCurCell.row, mCurCell.content);
mSheet.addCell(mLabel);
}
4.Sheet获取完Label之后调用Workbook的方法写入表中。
mWorkbook.write();
5.结束,释放资源。
mWorkbook.close();
完整代码:
public class ExcelWriteTask extends AsyncTask<String, String, String> {
private Context mContext;
private List<Community> list;
private ArrayList<CurCell> mArrayList = new ArrayList<CurCell>();
private ProgressDialog pdialog;
public ExcelWriteTask(Context mContext, List<Community> list) {
super();
this.mContext = mContext;
this.list = list;
mArrayList = new ArrayList<CurCell>();
for (int i = 0; i < list.size(); i++) {
Community community = list.get(i);
for (int j = 0; j < 3; j++) {
CurCell cell = new CurCell();
cell.row = i;
cell.col = j;
cell.content = community.getProperty(j);
mArrayList.add(cell);
}
}
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pdialog = ProgressDialog.show(mContext, "正在写入Excel...", "正在请求....");
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
WriteExcel(params[0]);
return null;
}
@Override
protected void onProgressUpdate(String... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
pdialog.setMessage(values[0]);
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Toast.makeText(mContext, "写入Excel数据完成!请到SD卡根目录下查看", Toast.LENGTH_LONG).show();
pdialog.dismiss();
}
private void WriteExcel(String sheetName){
try {
File file = new File("/mnt/sdcard/" + sheetName + ".xls");
if (!file.exists()) {
file.createNewFile();
}
WritableWorkbook mWorkbook = Workbook.createWorkbook(file);
WritableSheet mSheet = mWorkbook.createSheet(sheetName, 0);
for(CurCell mCurCell : mArrayList){
Label mLabel = new Label(mCurCell.col, mCurCell.row, mCurCell.content);
mSheet.addCell(mLabel);
}
mWorkbook.write();
mWorkbook.close();
} catch (RowsExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class CurCell{
int row;
int col;
String content;
}
}
其他:
创建表格有时会有命名要求,要求加入日期(XXXXX2016年1月1日.exl),一天一张表格,便于查找及保存,可以考虑SimpleDateFormat。
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
Date now = new Date();
String d = dateFormat.format(now);
获取系统日期后添加到表格名称XXXXX后面即可;
File file = new File(<span style="font-family: Arial, Helvetica, sans-serif;">"/mnt/sdcard/" + sheetName + d + ".xls"</span>);
如果需要将实例的属性名添加在表中第一行,要在创建Workbook时将sheet创建好再将属性名添加到第一行,添加属性值的时候从第二行开始添加。
效果图: