在实际Android应用中,如果有的数据是需要打印或者记录怎么办,特别是类似记账APP,用户需要按月打印表格怎么办,总不会要让用户在记录到手机上的数据再重新打一遍吧,所以这里的一键生成表格就显得人性化许多,对吧。
(开发环境:Android studio)
好,这里是需要jxl包的。
当然首先是下载jar包配置好。然后就是一系列疯狂操作:
public class FileUtils {
//sd卡根目录
private static final String BASE_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator;
private static final String rootDir=BASE_PATH+"/储存表格的文件夹名/";
private static String[] title = { "车主姓名","客户等级","单位/地址", "联系电话", "身份证号", "车牌号码","车色/车型","车识别号","年均行程","修车记录"};
private static Label label;
public static void makeRootDirectory() {
File file = null;
try {
file = new File(rootDir);
if (!file.exists()) {
file.mkdir();
}
} catch (Exception e) {
}
}
public static void writeExcel(Context context, List<MyBean> beanList) throws Exception {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)&&getAvailableStorage()>1000000) {
Toast.makeText(context, "SD卡不可用", Toast.LENGTH_LONG).show();
return;
}else{
Toast.makeText(context, "正在为您生成,请稍后...", Toast.LENGTH_SHORT).show();
}
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd");
File file = new File(rootDir,formatter.format(new Date()) + "CarInfo.xls");
// 创建Excel工作表
WritableWorkbook wwb;
OutputStream os = new FileOutputStream(file);
wwb = Workbook.createWorkbook(os);
// 添加第一个工作表并设置第一个Sheet的名字
WritableSheet sheet = wwb.createSheet("首佳车信记录表", 0);
for (int i = 0; i < title.length; i++) {
// Label(x,y,z) 代表单元格的第x+1列,第y+1行, 内容z
// 在Label对象的子对象中指明单元格的位置和内容
label = new Label(i, 0, title[i], getHeader());
// 将定义好的单元格添加到工作表中
sheet.addCell(label);
}
for (int i = 0; i < beanList.size(); i++) {
MyBean b = beanList.get(i);
Label state = new Label(0, i + 1, b.getpName());
Label date = new Label(1, i + 1, b.getpLevel());
................
一阵疯狂操作
................
Label remark = new Label(9, i + 1, b.getRemarks());
sheet.addCell(state);
sheet.addCell(date);
................
一阵疯狂操作
................
sheet.addCell(remark);
}
// 写入数据
wwb.write();
// 关闭文件
wwb.close();
Toast.makeText(context, "表格文件生成完毕! 文件路径:\n" + rootDir ,Toast.LENGTH_LONG).show();
}
public static WritableCellFormat getHeader() {
WritableFont font = new WritableFont(WritableFont.TIMES, 10,
WritableFont.BOLD);// 定义字体
try {
font.setColour(Colour.BLUE);// 蓝色字体
} catch (WriteException e1) {
e1.printStackTrace();
}
WritableCellFormat format = new WritableCellFormat(font);
try {
format.setAlignment(jxl.format.Alignment.CENTRE);// 左右居中
format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);// 上下居中
// format.setBorder(Border.ALL, BorderLineStyle.THIN,
// Colour.BLACK);// 黑色边框
// format.setBackground(Colour.YELLOW);// 黄色背景
} catch (WriteException e) {
e.printStackTrace();
}
return format;
}
/** 获取SD可用容量 */
private static long getAvailableStorage() {
StatFs statFs = new StatFs(BASE_PATH);
long blockSize = statFs.getBlockSize();
long availableBlocks = statFs.getAvailableBlocks();
long availableSize = blockSize * availableBlocks;
// Formatter.formatFileSize(context, availableSize);
return availableSize;
}
}
Yi: -> makeRootDirectory():
创建表格的文件目录,一般地这个方法在安装APP的时候就执行完毕。
Er: -> writeExcel():
生成表格,基本上是在用户点击了一个按钮执行此方法。
San: -> getHeader():
创建表头,在 Er 中调用。
Si: -> getAvailableStorage():
获取SD可用容量,一般现在手机都可以满足的了,在 Er 中调用。
其中
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd");
File file = new File(rootDir,formatter.format(new Date()) + "CarInfo.xls");
是在生成的文件前边加时间前缀,好明确这个文件是那日生成的,做个时间记录。
好用?那是必须的!
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}