欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 数据导出Excel java POI 导出数据Excel

程序员文章站 2022-06-02 18:24:45
...

                   java 数据导出Excel java POI 导出数据Excel

 

一、说明

1、使用Apache poi 实现java中导出excel格式数据。

2、依赖pom:

     <dependency>
	    <groupId>org.apache.poi</groupId>
	    <artifactId>poi</artifactId>
	    <version>3.15</version>
	</dependency>
    
	<dependency>
	    <groupId>org.apache.poi</groupId>
	    <artifactId>poi-ooxml</artifactId>
	    <version>3.15</version>
	</dependency>

二、具体代码实现

1、创建 ExcelExport 类,实现excel数据导出

import java.io.File;
import java.io.FileOutputStream;
import java.net.URLEncoder;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;

/**
 * description: Excel 数据输出
 * @version v1.0
 * @author w
 * @date 2020年3月30日下午1:46:59
 **/
public class ExcelExport {
	
	private ExcelExport INSTANSE = new ExcelExport ();
	
	/**
	 * description: 导出数据excel
	 * @param sheetName
	 * @param headers
	 * @param dataList
	 * @param destFile
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2020年3月30日 下午2:23:39
	 */
	public static void export(String sheetName, String[] headers, List<List<Object>> dataList, File destFile) throws Exception {
		SXSSFWorkbook workbook = new SXSSFWorkbook();
		createSheet(sheetName, headers, dataList, workbook);
		workbook.write(new FileOutputStream(destFile));
	}
	
	
	/**
	 * description: 导出excel --- 支持web
	 * @param sheetName  sheet表名字
	 * @param headers 表头
	 * @param dataList 表数据
	 * @param fileName  导出文件名
	 * @param response 
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2020年3月31日 下午2:48:46
	 */
	public static void export(String sheetName , String[] headers , List<List<Object>> dataList ,String fileName 
			 								   , HttpServletResponse response) throws Exception {
		SXSSFWorkbook workbook = new SXSSFWorkbook();
		createSheet(sheetName, headers, dataList, workbook);
		response.reset();
        response.setContentType("application/octet-stream; charset=utf-8");
        response.setHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode(fileName ,"UTF-8"));
        workbook.write(response.getOutputStream());
        // 删除临时文件
        workbook.dispose();
	}
	
	/**
	 * description: 创建sheet表格
	 * @param sheetName  表sheet 名字
	 * @param headers  表头
	 * @param dataList 表数据
	 * @param wb
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2020年3月30日 下午2:33:39
	 */
	public static void createSheet(String sheetName , String[] headers , List<List<Object>> dataList , SXSSFWorkbook wb) {
		SXSSFSheet sheet = wb.createSheet(sheetName);
		// 设置表头和单元格格式
		CellStyle headStyle = setHeaderStyle(wb);
		CellStyle bodyStyle = setBodyStyle(wb);
		// 创建表头和单元格数据
        createHeader(headers, sheet, headStyle);
        createBody(dataList, sheet, bodyStyle);
	}
	
	/**
	 * description: 创建表头
	 * @param headers
	 * @param sheet
	 * @param headStyle
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2020年3月30日 下午3:03
	 */
	private static void createHeader(String[] headers, SXSSFSheet sheet, CellStyle headStyle) {
		SXSSFRow row = sheet.createRow(0);
		row.setHeightInPoints(16F);
		for (int i = 0; i < headers.length; i++) {
			// 创建单元格
			SXSSFCell cell = row.createCell(i);
			cell.setCellStyle(headStyle);
			XSSFRichTextString text = new XSSFRichTextString(headers[i]);
            cell.setCellValue(text);
            sheet.trackAllColumnsForAutoSizing();
            sheet.autoSizeColumn(i);
		}
	}
	
	/**
	 * description: 表格中填充数据
	 * @param dataList
	 * @param sheet
	 * @param bodyStyle
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date  2020年3月30日 下午3:13
	 */
	private static void createBody(List<List<Object>> dataList, SXSSFSheet sheet, CellStyle bodyStyle) {
		for (int i = 0; i < dataList.size(); i++) {
			// 从第二行开始,第一行做表头
			SXSSFRow row = sheet.createRow(i+1);
			List<Object> rowList = dataList.get(i);
			for (int j = 0; j < rowList.size(); j++) {
				SXSSFCell cell = row.createCell(j);
				cell.setCellStyle(bodyStyle);
				XSSFRichTextString text = new XSSFRichTextString(rowList.get(j).toString());
				cell.setCellValue(text);
				sheet.trackAllColumnsForAutoSizing();
				sheet.autoSizeColumn(i);
			}
		}
	}
	
	/**
	 * description: 设置单元格内容样式
	 * @param wb
	 * @return HSSFCellStyle
	 * @version v1.0
	 * @author w
	 * @date 2020年3月30日 下午2:42:39
	 */
	private static CellStyle setBodyStyle(SXSSFWorkbook wb) {
		// 设置表格单元格格式
		CellStyle style = wb.createCellStyle();
        style.setFillForegroundColor(HSSFColor.WHITE.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_LEFT);

        // 设置字体格式
        Font font = wb.createFont();
        font.setFontName("微软雅黑");
        font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
        style.setFont(font);
        return style;
	}

	/**
	 * description: 设置表头样式 
	 * @param wb
	 * @return
	 * @return HSSFCellStyle
	 * @version v1.0
	 * @author w
	 * @date 2020年3月30日 下午2:38:39
	 */
	private static CellStyle setHeaderStyle(SXSSFWorkbook wb) {
		// 设置表格单元格格式
		CellStyle style = wb.createCellStyle();
		style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		style.setBorderRight(CellStyle.BORDER_THIN);
		style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
		style.setBorderLeft(CellStyle.BORDER_THIN);
		style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
		style.setBorderTop(CellStyle.BORDER_THIN);
		style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
		style.setBorderBottom(CellStyle.BORDER_THIN);
		style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
	    
	    // 设置字体格式
	    Font font = wb.createFont();
	    font.setFontName("微软雅黑");
	    font.setFontHeightInPoints((short) 10);
	    style.setFont(font);
	    return style;
	}

}

 

2、创建ExcelController,测试web情况下,导出数据

    /**
	 * description: excel 数据导出 
	 * @return String
	 * @version v1.0
	 * @author w
	 * @throws IOException 
	 * @date 2020年3月31日 下午2:41:03
	 */
	@RequestMapping(value= "/export")
	public String export(HttpServletResponse response) throws IOException {
		String[] headers = new String[] {"姓名","年龄","级别"};
		List<List<Object>> dataList = new ArrayList<>();
		for(int x = 0 ; x < 3 ; x++) {
			List<Object> data = new ArrayList<Object>();
			data.add("姓名ssssss"+x);
			data.add(18+x);
			data.add("级别"+x);
			dataList.add(data);
		}
		try {
			ExcelExport.export("用户数据", headers, dataList,"poi导出模板.xlsx" ,response);
			return null ;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "导出失败 --";
	}

3、测试,访问: http://localhost:999/spring-mvc-tourist/excelController/export

4、结果:浏览器返回excel,数据都填充进去

java 数据导出Excel java POI 导出数据Excel

三、总结

 

1、本示例使用的是 poi 3.15版的,其他版本之间,可能出现无法使用的情况,需要做部分调整。

2、具体使用,请查看 ExcelExport 类中方法注释情况。

3、不懂的,可以私信提供源码的噢。

 

 

 

相关标签: Java