当前B/S模式已成为应用开发的主流,很多时候需要实现导入、导出Excel的应用。
1.下载相关jar包
下载链接:https://pan.baidu.com/s/1iMspcX18WytfSWEGBNEsLQ 密码:jhy0
也可自行下载 jxl.jar。
2.将jxl.jar拷贝到项目的lib下
3.使用Java Excel Api 导出 Excel文件
代码应封装到业务层组件中,然后在控制层中调用。这里直接写在控制层组件,如Servlet的doGet/doPost方法。下面直接上代码。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//字符格式
request.setCharacterEncoding("utf-8");
String path = "";
if (request.getPathInfo() != null) {
path = request.getPathInfo().substring(1);
}
System.out.println("Excel导出:"+path);
OutputStream output = response.getOutputStream();
response.reset();
response.setHeader("Content-disposition","attachment; filename=temp.xls");
response.setContentType("application/msexcel");
// 创建可写入的Excel工作薄,且内容将写入到输出流,并通过输出流输出给客户端浏览 (发送给客户端)
WritableWorkbook wwb = Workbook.createWorkbook(output);
// 创建可写入的Excel工作薄 (写入磁盘)
// File file = new File("d://test.xls");
// WritableWorkbook wwb = Workbook.createWorkbook(file);
// /创建可写入的Excel工作表
WritableSheet sheet = wwb.createSheet("用户表", 0);
try {
// 单元格合并方法
sheet.mergeCells(0, 0, 4, 0);
// 创建WritableFont 字体对象,参数依次表示黑体、字号12、粗体、非斜体、不带下划线、亮蓝色
WritableFont titleFont = new WritableFont(WritableFont.createFont("微软雅黑"), 12, WritableFont.BOLD,false, UnderlineStyle.NO_UNDERLINE, Colour.YELLOW);
// 创建WritableCellFormat对象,将该对象应用于单元格从而设置单元格的样式
WritableCellFormat titleFormat = new WritableCellFormat();
// 设置字体格式
titleFormat.setFont(titleFont);
// 设置文本水平居中对齐
titleFormat.setAlignment(Alignment.CENTRE);
// 设置文本垂直居中对齐
titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
// 设置背景颜色
titleFormat.setBackground(Colour.GRAY_25);
// 设置自动换行
titleFormat.setWrap(true);
WritableCellFormat cloumnTitleFormat = new WritableCellFormat();
cloumnTitleFormat.setFont(new WritableFont(WritableFont.createFont("微软雅黑"), 10, WritableFont.BOLD, false));
cloumnTitleFormat.setAlignment(Alignment.CENTRE);
// 添加Label对象,参数依次表示在第一列,第一行,内容,使用的格式
if("movie".equals(path)){
sheet.addCell(new Label(0, 0, "电影表", titleFormat));
sheet.addCell(new Label(0, 1, "电影名称", cloumnTitleFormat));
sheet.addCell(new Label(1, 1, "类别", cloumnTitleFormat));
sheet.addCell(new Label(2, 1, "导演", cloumnTitleFormat));
sheet.addCell(new Label(3, 1, "主演", cloumnTitleFormat));
sheet.addCell(new Label(4, 1, "地区", cloumnTitleFormat));
sheet.addCell(new Label(5, 1, "上映时间", cloumnTitleFormat));
sheet.addCell(new Label(6, 1, "简介", cloumnTitleFormat));
int row = 2;
//实例操作类,查询数据库内的电影
MovieDAOImp mdi = new MovieDAOImp();
//实例操作类,查询数据库内的电影类别
TypeDAOImp tdi = new TypeDAOImp();
for (Movie movie : mdi.selectMovieAll()) {
int col = 0;
sheet.addCell(new Label(col++, row, movie.getMovieName()));
sheet.addCell(new Label(col++, row, tdi.typeName(movie.getTypeID(), "").getTypeName()));
sheet.addCell(new Label(col++, row, movie.getDirector()));
sheet.addCell(new Label(col++, row, movie.getStardom()));
sheet.addCell(new Label(col++, row, movie.getRegion()));
sheet.addCell(new Label(col++, row, movie.getShowtime()));
sheet.addCell(new Label(col++, row, movie.getDescription()));
row++;
}
}
} catch (RowsExceededException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (WriteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 操作完成时,关闭对象,释放占用的内存空间
try {
wwb.write();
wwb.close();
} catch (WriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
4.对于Excel单元格操作和数据格式化
对于字体,字号以及数据格式化,我们需要构造WritableFont和WritableCellFormat类,如
创建一个字体为宋体,字号14,加粗显示的字体格式
// 宋体,14号字,加粗
WritableFont font=new WritableFont(WritableFont.createFont("宋体"),14,WritableFont.NO_BOLD );
WritableCellFormat format = new WritableCellFormat(font);
// 第N列,第N行,文本内容,格式
Label label=new Label(0,0,”编号001”,format);
与Label类似的还有Number、DateTime,区别Label表示文本数据;Number表示数值数据,可使NumberFormat格式化数据;用DateTime表示日期型数据,可应用DateFormat格式化数据。
合并单元格,设置行高,列宽
从(a,b)到(m,n)的单元格全部合并 WritableSheet.mergeCells(int a,int b,int m,int n);
//合并第一列第一行到第五列第一行的所有单元格
sheet.mergeCells(0,0,4,0);
设置列宽 WritableSheet.setColumnView(int i , int width);
//将第二行的列宽设置为50
sheet.setColumnView(1,50);
设置行高 writableSheet.setRowView(int i , int height);
//第六行行高为100
sheet.setRowView(5,100);
希望本篇文章可以帮助到您!