• JAVA实现EXCEL导出


    多说无益,直接上代码

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.poi.hssf.usermodel.HSSFRichTextString;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    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.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping(value = "/analyze")
    public class AnalyzeController {
    
    	@RequestMapping(value = "/export")
    	public void excelExport(HttpServletRequest request,
    			HttpServletResponse response) {
    		String fileName = "文件名";
    		// 填充projects数据
    		List<TestAnalyzeModal> projects = createData();
    		List<Map<String, Object>> list = createExcelRecord(projects);
    		String columnNames[] = {"ID","姓名" };// 列名
    		String keys[] = {  "id", "name" };// map中的key
    		ByteArrayOutputStream os = new ByteArrayOutputStream();
    		try {
    			createWorkBook(list, keys, columnNames).write(os);
    		} catch (IOException e) {
    		}
    		byte[] content = os.toByteArray();
    		InputStream is = new ByteArrayInputStream(content);
    		// 设置response参数,可以打开下载页面
    		BufferedInputStream bis = null;
    		BufferedOutputStream bos = null;
    		try {
    			response.reset();
    			response.setContentType("application/vnd.ms-excel;charset=utf-8");
    			response.setHeader("Content-Disposition", "attachment;filename="
    					+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
    			ServletOutputStream out = response.getOutputStream();
    			bis = new BufferedInputStream(is);
    			bos = new BufferedOutputStream(out);
    			byte[] buff = new byte[2048];
    			int bytesRead;
    			// Simple read/write loop.
    			while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
    				bos.write(buff, 0, bytesRead);
    			}
    		} catch (final IOException e) {
    			try {
    				throw e;
    			} catch (IOException e1) {
    			}
    		} finally {
    			if (bis != null)
    				try {
    					bis.close();
    				} catch (IOException e) {
    					
    				}
    			if (bos != null)
    				try {
    					bos.close();
    				} catch (IOException e) {
    					
    				}
    		}
    	}
    
    	private List<TestAnalyzeModal> createData() {
    		List<TestAnalyzeModal> list = new ArrayList<TestAnalyzeModal>();
    
    		//数据绑定
    		return list;
    	}
    
    	private List<Map<String, Object>> createExcelRecord(
    			List<TestAnalyzeModal> projects) {
    		List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>();
    		Map<String, Object> map = new HashMap<String, Object>();
    		map.put("sheetName", "sheet1");
    		listmap.add(map);
    		TestAnalyzeModal project = null;
    		for (int j = 0; j < projects.size(); j++) {
    			project = projects.get(j);
    			Map<String, Object> mapValue = new HashMap<String, Object>();
    			mapValue.put("id", project.getId());
    			mapValue.put("name", project.getName());
    			
    			listmap.add(mapValue);
    		}
    		return listmap;
    	}
    
    	/**
    	 * 创建excel文档,
    	 * 
    	 * @param list
    	 *            数据
    	 * @param keys
    	 *            list中map的key数组集合
    	 * @param columnNames
    	 *            excel的列名
    	 * */
    	public static Workbook createWorkBook(List<Map<String, Object>> list,
    			String[] keys, String columnNames[]) {
    		// 创建excel工作簿
    		Workbook wb = new HSSFWorkbook();
    		// 创建第一个sheet(页),并命名
    		Sheet sheet = wb.createSheet(list.get(0).get("sheetName").toString());
    	
    		// 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。
    		for (int i = 0; i < keys.length; i++) {
    			sheet.setColumnWidth((short) i, (short) (35.7 * 150));
    		}
    
    		// 创建第一行
    		Row row = sheet.createRow((short) 1);
    
    		// 创建两种单元格格式
    		CellStyle cs = wb.createCellStyle();
    		CellStyle cs2 = wb.createCellStyle();
    
    		// 创建两种字体
    		Font f = wb.createFont();
    		Font f2 = wb.createFont();
    
    		// 创建第一种字体样式(用于列名)
    		f.setFontHeightInPoints((short) 10);
    		f.setColor(IndexedColors.BLACK.getIndex());
    		f.setBoldweight(Font.BOLDWEIGHT_BOLD);
    
    		// 创建第二种字体样式(用于值)
    		f2.setFontHeightInPoints((short) 10);
    		f2.setColor(IndexedColors.BLACK.getIndex());
    
    		// Font f3=wb.createFont();
    		// f3.setFontHeightInPoints((short) 10);
    		// f3.setColor(IndexedColors.RED.getIndex());
    
    		// 设置第一种单元格的样式(用于列名)
    		cs.setFont(f);
    		cs.setBorderLeft(CellStyle.BORDER_THIN);
    		cs.setBorderRight(CellStyle.BORDER_THIN);
    		cs.setBorderTop(CellStyle.BORDER_THIN);
    		cs.setBorderBottom(CellStyle.BORDER_THIN);
    		cs.setAlignment(CellStyle.ALIGN_CENTER);
    
    		// 设置第二种单元格的样式(用于值)
    		cs2.setFont(f2);
    		cs2.setBorderLeft(CellStyle.BORDER_THIN);
    		cs2.setBorderRight(CellStyle.BORDER_THIN);
    		cs2.setBorderTop(CellStyle.BORDER_THIN);
    		cs2.setBorderBottom(CellStyle.BORDER_THIN);
    		cs2.setAlignment(CellStyle.ALIGN_CENTER);
    		
    		//合并单元格
    		int num = 2;
    		Row rowFirst = sheet.createRow((short) 0);
    		Cell cellFirst=rowFirst.createCell(num);
    		cellFirst.setCellValue("value");
    		cellFirst.setCellStyle(cs);
    	
    		//CellRangeAddress(起始行,结束行,起始列,结束)
    		//合并行
    		sheet.addMergedRegion(new CellRangeAddress(0,0,2,5));
    		
    		//合并列
    		sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));
    		
    		
    		// 设置列名
    		for (int i = 0; i < columnNames.length; i++) {
    			Cell cell = row.createCell(i);
    			cell.setCellValue(columnNames[i]);
    			cell.setCellStyle(cs);
    		}
    		// 设置每行每列的值
    		for (short i = 1; i < list.size(); i++) {
    			// Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
    			// 创建一行,在页sheet上
    			Row row1 = sheet.createRow((short) i+1);
    			// 在row行上创建一个方格
    			for (short j = 0; j < keys.length; j++) {
    				Cell cell = row1.createCell(j);	
    				cell.setCellValue(list.get(i).get(keys[j]) == null ? " " : list
    						.get(i).get(keys[j]).toString());
    				cell.setCellStyle(cs2);
    			}
    		}
    		
    		Row  bottom= sheet.createRow((short) list.size()+3);
    		String title = "说明";
    		Cell bottomCell=bottom.createCell(0);
    		bottomCell.setCellValue(new HSSFRichTextString(title));
                    //自动换行
    		cs2.setWrapText(true); 
                    //左对齐
    		cs2.setAlignment(CellStyle.ALIGN_LEFT);
    		bottomCell.setCellStyle(cs2);
    		sheet.addMergedRegion(new CellRangeAddress(list.size()+3,list.size()+7,0,10));
    		return wb;
    	}
    }
             
    

      

  • 相关阅读:
    26个Jquery使用小技巧(jQuery tips, tricks & solutions)
    JavaScript中Eval()函数的作用
    基于邮件通道的WCF通信系统
    同步一个数据库要发多少个数据包?
    还在写SQL的同志,去喝杯咖啡吧!
    隐藏在程序旮旯中的“安全问题”
    在SQLMAP中使用动态SQL
    SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。
    实例探究字符编码:unicode,utf8,default,gb2312 的区别
    Why to do,What to do,Where to do 与 Lambda表达式!
  • 原文地址:https://www.cnblogs.com/binbang/p/4807710.html
Copyright © 2020-2023  润新知