zoukankan      html  css  js  c++  java
  • 学习:POI导出EXCEL

    目前用的POI版本为3.8.0beta5

    Excel的相关类基本以HSSF开头,下面列举几个常用类:

    HSSFWorkbook:工作簿,对应Excel文件

    HSSFSheet:表单,对应Excel的表单

    HSSFRow:行,对应Excel的每一行

    HSSFCell:单元格,对应Excel的单元格

    HSSFCellStyle:单元格样式,用于定义每个单元格的颜色、边框、字体、字号等等

    创建的次序应该为HSSFWorkbook -> HSSFSheet -> HSSFRow-> HSSFCell

    行高定义由Row决定,列宽由Sheet的columnWidth决定。columnWidth的内容是按照像素来的。

    写入文件只需调用HSSFWordbook#write(OutputStream);即可

    备忘一段代码:

    package com.anrainie.ide.flow.utilities.tool;
    
    import com.anrainie.ide.core.translators.StyleTranslator;
    import com.anrainie.ide.flow.utilities.document.MarsApplication;
    import com.anrainie.ide.flow.utilities.document.MarsCptContainer;
    import com.anrainie.ide.flow.utilities.document.MarsCptLevel1;
    import com.anrainie.ide.flow.utilities.document.MarsCptLevel2;
    import com.anrainie.ide.flow.utilities.document.MarsProject;
    import com.anrainie.ide.flow.utilities.document.MarsTechCpt;
    import com.anrainie.ide.flow.utilities.document.MarsTrade;
    import com.anrainie.ide.flow.utilities.nls.Messages;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    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;
    import org.eclipse.core.resources.IFile;
    import org.eclipse.core.resources.IFolder;
    
    /**
     * Excel文档导出工具类
     * 
     * @author caiyu
     * 
     */
    public class ExcelTool {
    	private static String[] HEADS_TWF = new String[] {
    			Messages.ExcelTool_TWF_APPNAME, Messages.ExcelTool_TWF_APPDESC,
    			Messages.ExcelTool_TWF_TRADECATEGORY,
    			Messages.ExcelTool_TWF_TRADENAME, Messages.ExcelTool_TWF_TRADEDESC,
    			Messages.ExcelTool_TWF_TRADEMODELNAME,
    			Messages.ExcelTool_TWF_AUTHOR,
    			Messages.ExcelTool_TWF_COMPILERESULT, Messages.ExcelTool_Tooltip };
    
    	private static String[] HEADS_TCD = new String[] {
    			Messages.ExcelTool_TCD_LEVEL1, Messages.ExcelTool_TCD_LEVEL2,
    			Messages.ExcelTool_TCD_NAME_CN, Messages.ExcelTool_TCD_NAME_EN,
    			Messages.ExcelTool_TCD_STYLE, Messages.ExcelTool_TCD_ANNOTATION };
    
    	/**
    	 * 按Excel格式导出TCD文档
    	 * 
    	 * @param fileList
    	 * @param path
    	 */
    	public static void exportTcdDocument(List<IFile> fileList, String path) {
    		// TODO
    		HSSFWorkbook workbook = new HSSFWorkbook();
    		HSSFCellStyle headStyle = createHeadStyle(workbook);
    		HSSFCellStyle contentStyle = createContentStyle(workbook);
    		List<MarsCptContainer> containerList = DocumentInfoUtil
    				.getTcdDocumentInfo(fileList);
    		for (MarsCptContainer container : containerList) {
    			HSSFSheet sheet = workbook.createSheet(container.getName());
    			sheet.setDefaultColumnWidth(20);
    			// 产生表格标题行
    			HSSFRow row = sheet.createRow(0);
    
    			for (int i = 0; i < HEADS_TCD.length; i++) {
    				HSSFCell cell = row.createCell(i);
    				cell.setCellStyle(headStyle);
    				HSSFRichTextString text = new HSSFRichTextString(HEADS_TCD[i]);
    				cell.setCellValue(text);
    			}
    			int rowCount = 1;
    			for (int i = 0; i < container.getPretreatList().size(); i++) {
    				MarsCptLevel1 level1 = container.getPretreatList().get(i);
    				int j = 0;
    				int oldCount = rowCount;
    				for (; j < level1.getSubList().size(); j++) {
    					MarsCptLevel2 level2 = level1.getSubList().get(j);
    					int n = 0;
    					for (; n < level2.getCptList().size(); n++) {
    						MarsTechCpt cpt = level2.getCptList().get(n);
    
    						row = sheet.createRow(rowCount++);
    						createCell(level1.getName(), row, contentStyle, 0);
    						createCell(level2.getName(), row, contentStyle, 1);
    						createCell(cpt.getChineseName(), row, contentStyle, 2);
    						createCell(cpt.getEnglishName(), row, contentStyle, 3);
    						createCell(StyleTranslator.translateValueToDesc(cpt
    								.getStyle()), row, contentStyle, 4);
    						createCell(cpt.getAnnocation(), row, contentStyle, 5);
    					}
    				}
    				if (rowCount - 2 <= 0)
    					continue;
    				sheet.groupRow(oldCount, rowCount - 2);
    			}
    			sheet.setColumnWidth(3, 100 * 80);
    			sheet.setColumnWidth(4, 30 * 80);
    			sheet.setColumnWidth(5, 120 * 80);
    		}
    		FileOutputStream out = null;
    		try {
    			File file = new File(path);
    			if (!file.exists())
    				file.createNewFile();
    			out = new FileOutputStream(file);
    			workbook.write(out);
    			DocumentInfoUtil.successRemind();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (out != null)
    					out.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    
    		}
    
    	}
    
    	/**
    	 * 导出Excel格式的TWF文档
    	 * 
    	 * @param fileList
    	 *            TWF文件列表
    	 * @param path
    	 *            导出文件的位置
    	 */
    	public static void exportTwfDocument(List<IFolder> fileList, String path) {
    		HSSFWorkbook workbook = new HSSFWorkbook();
    		HSSFCellStyle headStyle = createHeadStyle(workbook);
    		HSSFCellStyle contentStyle = createContentStyle(workbook);
    
    		List<MarsProject> projectList = DocumentInfoUtil
    				.getTwfDocumentInfo(fileList);
    		for (MarsProject project : projectList) {
    			HSSFSheet sheet = workbook.createSheet(project.getName());
    			sheet.setDefaultColumnWidth(15);
    			// 产生表格标题行
    			HSSFRow row = sheet.createRow(0);
    
    			for (int i = 0; i < HEADS_TWF.length; i++) {
    				HSSFCell cell = row.createCell(i);
    				cell.setCellStyle(headStyle);
    				HSSFRichTextString text = new HSSFRichTextString(HEADS_TWF[i]);
    				cell.setCellValue(text);
    			}
    			int rowCount = 1;
    			for (int i = 0; i < project.getAppList().size(); i++) {
    				MarsApplication app = project.getAppList().get(i);
    				int j = 0;
    				int oldCount = rowCount;
    				for (; j < app.getTradeList().size(); j++) {
    					MarsTrade trade = app.getTradeList().get(j);
    					row = sheet.createRow(rowCount++);
    					createCell(app.getName(), row, contentStyle, 0);
    					createCell(app.getDesc(), row, contentStyle, 1);
    					createCell(trade.getCategory(), row, contentStyle, 2);
    					createCell(trade.getName(), row, contentStyle, 3);
    					createCell(trade.getDesc(), row, contentStyle, 4);
    					createCell(trade.getTradeModel(), row, contentStyle, 5);
    					createCell(trade.getAuthor(), row, contentStyle, 6);
    					createCell(trade.getCompileResult(), row, contentStyle, 7);
    					createCell(trade.getTooltip(), row, contentStyle, 8);
    				}
    				if (rowCount - 2 <= 0)
    					continue;
    				sheet.groupRow(oldCount, rowCount - 2);
    			}
    			sheet.setColumnWidth(1, 95 * 80);
    			sheet.setColumnWidth(4, 95 * 80);
    			sheet.setColumnWidth(7, 95 * 80);
    			sheet.setColumnWidth(8, 95 * 80);
    		}
    		FileOutputStream out = null;
    		try {
    			File file = new File(path);
    			if (!file.exists())
    				file.createNewFile();
    			out = new FileOutputStream(file);
    			workbook.write(out);
    			DocumentInfoUtil.successRemind();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (out != null)
    					out.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    
    		}
    	}
    
    	/**
    	 * 创建cell
    	 * 
    	 * @param value
    	 *            值
    	 * @param row
    	 *            行对象
    	 * @param contentStyle
    	 *            cell风格
    	 * @param count
    	 *            cell位置
    	 */
    	private static void createCell(String value, HSSFRow row,
    			HSSFCellStyle contentStyle, int count) {
    		HSSFCell cell = row.createCell(count);
    		cell.setCellStyle(contentStyle);
    		HSSFRichTextString text = new HSSFRichTextString(value);
    		cell.setCellValue(text);
    	}
    
    	private static HSSFCellStyle createContentStyle(HSSFWorkbook workbook) {
    		HSSFCellStyle style = workbook.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_CENTER);
    		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    
    		HSSFFont font = workbook.createFont();
    		font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
    
    		style.setFont(font);
    		return style;
    	}
    
    	private static HSSFCellStyle createHeadStyle(HSSFWorkbook workbook) {
    		HSSFCellStyle style = workbook.createCellStyle();
    
    		style.setFillForegroundColor(HSSFColor.SKY_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);
    		return style;
    	}
    
    }
    

      应该说POI操作Excel还是比较方便的,除了设置行列的高度、宽度这一部分。

          但是一旦操作Word,就遇到了一堆的问题。所以操作word本人还是选择了itext,目前正在解决自动生成目录的问题。

  • 相关阅读:
    PHP 反射API
    wamp下mysql错误提示乱码的解法
    PDO、PDOStatement、PDOException
    PHP 常用函数
    TCP/IP
    centOS7+mariadb+Nginx+PHP7.0 安装
    php中引用&的真正理解-变量引用、函数引用、对象引用
    cgi fastcgi php-cgi php-fpm
    03 : linux判断服务器是虚拟机还是物理机
    02 :history命令显示日期-时间-登录IP-用户名
  • 原文地址:https://www.cnblogs.com/anrainie/p/2383891.html
Copyright © 2011-2022 走看看