解读Poi操作表格导出(生成多个sheet)

    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<List<String>> 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<String> 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<List<String>> data1 = new ArrayList<List<String>>();
         List<List<String>> data2 = new ArrayList<List<String>>();
         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导出方法,希望大家喜欢。

文章来源:

Author:海岸线的曙光
link:https://my.oschina.net/u/3747963/blog/1786281