Java表格导出的方式有很多,有前端弹出对话框的形式,有poi操作,有jxl操作,可以说实现的形式多种多样。下面我用的只是其中一个poi操作Excel表格,同时可以在一张表格中生成多个sheet,后端实现,动态指定,无前端操作对话框。
记得导入poi相关jar包,下面直接看代码吧:
package test; import java.io.OutputStream; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; public class ExcelUtils { /** * @Description: 导出Excel * @param workbook * @param sheetNum (sheet的位置,0表示第一个表格中的第一个sheet) * @param sheetTitle (sheet的名称) * @param headers (表格的列标题) * @param result (表格的数据) * @param out (输出流) * @throws Exception */ public void exportExcel(HSSFWorkbook workbook, int sheetNum, String sheetTitle, String[] headers, List
> result, OutputStream out) throws Exception { // 生成一个表格 HSSFSheet sheet = workbook.createSheet(); workbook.setSheetName(sheetNum, sheetTitle); // 设置表格默认列宽度为20个字节 sheet.setDefaultColumnWidth((short) 20); // 生成一个样式 HSSFCellStyle style = workbook.createCellStyle(); // 设置这些样式 style.setFillForegroundColor(HSSFColor.PALE_BLUE.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 生成一个字体 HSSFFont font = workbook.createFont(); font.setColor(HSSFColor.BLACK.index); font.setFontHeightInPoints((short) 12); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 把字体应用到当前的样式 style.setFont(font); // 指定当单元格内容显示不下时自动换行 style.setWrapText(true); // 产生表格标题行 HSSFRow row = sheet.createRow(0); for (int i = 0; i < headers.length; i++) { HSSFCell cell = row.createCell((short) i); cell.setCellStyle(style); HSSFRichTextString text = new HSSFRichTextString(headers[i]); cell.setCellValue(text.toString()); } // 遍历集合数据,产生数据行 if (result != null) { int index = 1; for (List m : result) { row = sheet.createRow(index); int cellIndex = 0; for (String str : m) { HSSFCell cell = row.createCell((short) cellIndex); cell.setCellValue(str.toString()); cellIndex++; } index++; } } } }
使用时也很方便:
public static void main(String[] args) { try { //excel导出的路径和名称 OutputStream out = new FileOutputStream("D:\\test.xls"); //生成两个sheet,不同的数据源和列标题 List
> data1 = new ArrayList
>(); List
> data2 = new ArrayList
>(); String[] headers1 = { "ID", "年龄","用户名" }; String[] headers2 = { "ID", "用户名" }; //注意int等其他类型转换成String类型 for (int i = 1; i < 5; i++) { List rowData = new ArrayList(); rowData.add(String.valueOf(i)); rowData.add(String.valueOf(i+20)); rowData.add("小明"+i+"号"); data1.add(rowData); } for (int i = 1; i < 5; i++) { List rowData = new ArrayList(); rowData.add(String.valueOf(i)); rowData.add("小明"+i+"号"); data2.add(rowData); } ExcelUtils eeu = new ExportExcelUtils(); HSSFWorkbook workbook = new HSSFWorkbook(); eeu.exportExcel(workbook, 0, "sheet1", headers1, data1, out); eeu.exportExcel(workbook, 1, "sheet2", headers2, data2, out); //将所有的数据一起写入,然后再关闭输入流。 workbook.write(out); out.close(); } catch (Exception e) { e.printStackTrace(); } }
从上面的调用可以看出:
(1)excel保存的路径和名称可以自己定义;
(2)数据源可以用其他地方获取,然后再赋值添加到现有的data中;
(3)每个sheet中的列可以不同,也可以相同;
(4)生成的sheet的多少取决于你;
好了,上面就是一个简单实用的excel导出方法,希望大家喜欢。