文档章节

POI创建EXCEL文档

MLeo
 MLeo
发布于 2013/11/19 16:57
字数 1537
阅读 128
收藏 6
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
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.apache.poi.ss.util.WorkbookUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.pinganfu.common.log.LOG_TYPE;
import com.pinganfu.newcard.gm.util.servlet.InitSystemServlet;
import com.pinganfu.newcard.gm.web.report.model.CellColumn;
import com.pinganfu.newcard.gm.web.report.model.ExcelColumn;
import com.pinganfu.newcard.gm.web.report.model.ExcelTitle;
import com.thoughtworks.xstream.XStream;
/**
 * 
 * 
 * @author MLeo
 * @version $Id: ExcelPOI.java, v 0.1 2014年8月11日 下午4:56:32 MLeo Exp $
 */
public class ExcelPOI {
    
    private  Workbook wb;
    private   ExcelTitle title;
    private  List<ExcelColumn> columns;
    private  List<CellStyle> contentStyles;
    private  Logger  LOG = LoggerFactory.getLogger(LOG_TYPE.PAFF_SERVICE.val);

    public  void loadXml(String xml) throws FileNotFoundException{
      xml = InitSystemServlet.rootPath+"WEB-INF"+File.separator+ "reportexcelxml" +File.separator+xml;
//      xml = InitSystemServlet.rootPath+File.separator+"WEB-INF"+File.separator+ "reportexcelxml" +File.separator+xml;
      LOG.info("xml:"+xml);
      XStream stream = new XStream();
      stream.alias("title", ExcelTitle.class);
      stream.alias("column", ExcelColumn.class);
      stream.alias("cell", CellColumn.class);
      
      title = (ExcelTitle)stream.fromXML(new FileInputStream(xml));
      columns = title.getColumns();
    }
    
    
    public  void loadExcel(String xml) throws FileNotFoundException{
        LOG.info("POIExcel:Lood");
        loadXml(xml);//加载XML文档
        wb  =  createWorkbook();//创建Workbook
        //添加sheet标签
        Sheet sheet = createSheet(wb, title.getTitleName());//创建标签
        //创建sheet样式
        CellStyle sheetStyle = wb.createCellStyle();
        sheetStyle(wb, sheetStyle,title);
        //添加sheet标题
        Row sheetRow = createRow(sheet, 1);//创建行
        for (int i = 0; i < columns.size(); i++) {
            Cell sheetCell = createCell(sheetRow, i+1);//创建单元格
            addStyle(sheetCell, sheetStyle);//添加样式
            if(0 == i){
                addValue(sheetCell, title.getTitleName());//添加单元格内容
            }
        }
        mergeCells(sheet, 1, 1, 1, columns.size());//合并表格
        
        //添加title标题
        Row titleRow = createRow(sheet, 2);//创建行
        for (int i = 0; i < columns.size(); i++) {
            ExcelColumn column = columns.get(i);
            Cell  titleCell = createCell(titleRow, i+1);//创建单元格
            CellStyle titleStyle = wb.createCellStyle();
            titleStyle(wb, titleStyle,column);
            addStyle(titleCell, titleStyle);//添加样式
            addValue(titleCell, column.getColumnName());//添加单元格内容
            columnWidth(sheet, i+1, column.getWidth()); //设置列宽
        }
        
        //创建cell样式
        contentStyles = new ArrayList<CellStyle>();
        for (ExcelColumn column : columns) {
            CellStyle contentStyle = wb.createCellStyle();
            contentStyle(wb,  contentStyle, column.getCell());
            contentStyles.add(contentStyle);
        }
        LOG.info("POIExcel:LoodEnd");
    }
    
    
    public   Workbook createExcel(List<?> list) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, FileNotFoundException {
            LOG.info("POIExcel:CreateExcelRow");
            //添加内容信息
            Sheet sheet = wb.getSheetAt(0);//获取当前的标签对象
            int rowNum = wb.getSheetAt(0).getLastRowNum();
            list = list == null ? new ArrayList<Object>():list;
            for (Object obj : list) {
                Row contentRow = createRow(sheet, ++rowNum);//创建行
                Class<?> clazz = obj.getClass();
                for (int i = 0; i < columns.size(); i++) {
                    ExcelColumn column = columns.get(i);
                    CellColumn cell = column.getCell();
                    Cell  contentCell = createCell(contentRow, i+1);//创建单元格
                    addStyle(contentCell, contentStyles.get(i));//添加样式
                    Field field = clazz.getDeclaredField(column.getField());
                    field.setAccessible(true);
                    Object fieldValue = field.get(obj);
                    addValue(contentCell, fieldValue,cell.getPrecision());//添加单元格内容
                }
        }
            LOG.info("POIExcel:CreateExcelRowEnd");
        return wb;
    }
    
    /**
     * 单元格赋值
     * @param cell 
     * @param value 
     */
    public  void addValue(Cell cell,Object value,Integer precision) {
        if(null == value){
            return;
        }else if (value instanceof String) {
            cell.setCellValue((String) value);
        } else if (value instanceof Date) {
            cell.setCellValue((Date) value);
        } else if (value instanceof Number) {
            if(null != precision && 0 != precision){
                cell.setCellValue(((Number) value).doubleValue()/precision);
            }else{
                cell.setCellValue(((Number) value).doubleValue());
            }
        } else if (value instanceof Boolean) {
            cell.setCellValue(((Boolean) value).booleanValue());
        } else {
            cell.setCellValue(value.toString());
        }
    }
    
    

    /**
     * 写入工作簿
     * 
     * @param wb
     * @param path
     */
    public  void writeWorkbook(Workbook wb, String pathBookName) {
        FileOutputStream fileOut = null;
        try {
            fileOut = new FileOutputStream(pathBookName);
            wb.write(fileOut);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fileOut.close();
                fileOut.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
    
    public  CellStyle  sheetStyle(Workbook wb,CellStyle style,ExcelTitle title){
        Font font = wb.createFont();
        if(title.getFontBlod()){
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);// 粗体
        }else{
            font.setBoldweight(Font.BOLDWEIGHT_NORMAL);// 粗体
        }
        if(0 != title.getFontSize()){
            font.setFontHeightInPoints(title.getFontSize());// 字体大小
        }else{
            font.setFontHeightInPoints((short)12);// 字体大小
        }
        if(null != title.getFontName() && !"".equals(title.getFontName())){
            font.setFontName(title.getFontName());// 字体名字
        }
        if("center".equals(title.getAlign())){
            style.setAlignment(CellStyle.ALIGN_CENTER);
        }else if("left".equals(title.getAlign())){
            style.setAlignment(CellStyle.ALIGN_LEFT);
        }else if("right".equals(title.getAlign())){
            style.setAlignment(CellStyle.ALIGN_RIGHT);
        }
        if("center".equals(title.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_CENTER);
        }else if("top".equals(title.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_TOP);
        }else if("bottom".equals(title.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_BOTTOM);
        }
        if(title.getBorder()){
            styleFrame(style);//设置边框  
        }
        style.setFont(font);
        return style;
    }
    
    public  CellStyle  titleStyle(Workbook wb,CellStyle style,ExcelColumn column){
        Font font = wb.createFont();
        if(column.getFontBlod()){
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);// 粗体
        }else{
            font.setBoldweight(Font.BOLDWEIGHT_NORMAL);// 粗体
        }
        if(0 != column.getFontSize()){
            font.setFontHeightInPoints(column.getFontSize());// 字体大小
        }else{
            font.setFontHeightInPoints((short)12);// 字体大小
        }
        if(null != column.getFontName() && !"".equals(column.getFontName())){
            font.setFontName(column.getFontName());// 字体名字
        }
        if("center".equals(column.getAlign())){
            style.setAlignment(CellStyle.ALIGN_CENTER);
        }else if("left".equals(column.getAlign())){
            style.setAlignment(CellStyle.ALIGN_LEFT);
        }else if("right".equals(column.getAlign())){
            style.setAlignment(CellStyle.ALIGN_RIGHT);
        }
        if("center".equals(column.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_CENTER);
        }else if("top".equals(column.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_TOP);
        }else if("bottom".equals(column.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_BOTTOM);
        }
        if(column.getBorder()){
            styleFrame(style);//设置边框  
        }
        style.setFont(font);
        return style;
    }
    
    public  CellStyle  contentStyle(Workbook wb,CellStyle style,CellColumn cell){
        Font font = wb.createFont();
        if(cell.getFontBlod()){
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);// 粗体
        }else{
            font.setBoldweight(Font.BOLDWEIGHT_NORMAL);// 粗体
        }
        if(0 != cell.getFontSize()){
            font.setFontHeightInPoints(cell.getFontSize());// 字体大小
        }else{
            font.setFontHeightInPoints((short)12);// 字体大小
        }
        if(null != cell.getFontName() && !"".equals(cell.getFontName())){
            font.setFontName(cell.getFontName());// 字体名字
        }
        if("center".equals(cell.getAlign())){
            style.setAlignment(CellStyle.ALIGN_CENTER);
        }else if("left".equals(cell.getAlign())){
            style.setAlignment(CellStyle.ALIGN_LEFT);
        }else if("right".equals(cell.getAlign())){
            style.setAlignment(CellStyle.ALIGN_RIGHT);
        }
        if("center".equals(cell.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_CENTER);
        }else if("top".equals(cell.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_TOP);
        }else if("bottom".equals(cell.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_BOTTOM);
        }
        if(null != cell.getFormat() && !"".equals(cell.getFormat())){
            DataFormat format = wb.createDataFormat();
            style.setDataFormat(format.getFormat(cell.getFormat()));
        }
        if(cell.getBorder()){
            styleFrame(style);//设置边框  
        }
        style.setFont(font);
        return style;
    }
 
    /**
     * 创建工作簿
     * 
     * @return Workbook
     */
    public  Workbook createWorkbook() {
        Workbook wb = new XSSFWorkbook();
        return wb;
    }
 
    /**
     * 创建工作表
     * 
     * @param sheetNames
     * @param wb
     */
    public  Sheet createSheet(Workbook wb, String sheetName) {
        String safeName = WorkbookUtil.createSafeSheetName(sheetName); // 一个安全的方式来创建有效的名称,这个工具替换无效字符用空格('')
        Sheet sheet = wb.createSheet(safeName);
        return sheet;
    }
    /**
     * 创建工作表
     * 
     * @param sheetNames
     * @param wb
     */
    public  List<Sheet> createSheets(Workbook wb, List<String> sheetNames) {
        List<Sheet> sheets = new ArrayList<Sheet>();
        for (String sheetName : sheetNames) {
            // 一个安全的方式来创建有效的名称,这个工具替换无效字符用空格('')
            String safeName = WorkbookUtil.createSafeSheetName(sheetName);
            Sheet sheet = wb.createSheet(safeName);
            sheets.add(sheet);
        }
        return sheets;
    }
 
    /**
     * 创建行
     * 
     * @param sheet
     * @param rowIndex
     * @return
     */
    public  Row createRow(Sheet sheet, int rowIndex) {
        Row row = sheet.createRow(rowIndex);
        return row;
    }
 
    /**
     * 创建单元格
     * 
     * @param row
     * @param cellIndex
     * @return Cell
     */
    public  Cell createCell(Row row, int cellIndex) {
        Cell cell = row.createCell(cellIndex);
        return cell;
    }
 
    /**
     * 单元格赋值
     * 
     * @param cell
     * @param cellValue Double
     * @return Cell
     */
    public  Cell addValue(Cell cell, Double cellValue) {
        cell.setCellValue(cellValue);
        return cell;
    }
    /**
     * 单元格赋值
     * 
     * @param cell
     * @param cellValue Date
     * @return Cell
     */
    public  Cell addValue(Cell cell, Date cellValue) {
        cell.setCellValue(cellValue);
        return cell;
    }
    /**
     * 单元格赋值
     * 
     * @param cell
     * @param cellValue Boolean
     * @return Cell
     */
    public  Cell addValue(Cell cell, Boolean cellValue) {
        cell.setCellValue(cellValue);
        return cell;
    }
    /**
     * 单元格赋值
     * 
     * @param cell
     * @param cellValue String
     * @return Cell
     */
    public  Cell addValue(Cell cell,String cellValue) {
        cell.setCellValue(cellValue);
        return cell;
    }
 
    /**
     * 添加样试
     * 
     * @param cell
     * @param style
     * @return
     */
    public  Cell addStyle(Cell cell, CellStyle style) {
        cell.setCellStyle(style);
        return cell;
    }
 
    /**
     * 设置字体颜色
     * 
     * @param wb
     * @param style
     * @param fontBlod 字体粗细
     * @param fontColor 字体颜色
     * @param fontHeight 字体大小
     * @param fontName 字体名字
     * @return
     */
    public  CellStyle styleFont(Workbook wb, CellStyle style, short fontBlod, short fontColor, short fontHeight, String fontName) {
        Font font = wb.createFont();
        font.setBoldweight(fontBlod);// 粗体
        font.setColor(fontColor);// 字体颜色
        font.setFontHeightInPoints(fontHeight);// 字体大小
        font.setFontName(fontName);// 字体名字
        style.setFont(font);
        return style;
    }
    
    /**
     * 设置字体颜色
     * 
     * @param wb
     * @param style
     * @param fontBlod 字体粗细
     * @param fontColor 字体颜色
     * @param fontHeight 字体大小
     * @return
     */
    public  CellStyle styleFont(Workbook wb, CellStyle style, short fontBlod, short fontColor, short fontHeight) {
        Font font = wb.createFont();
        font.setBoldweight(fontBlod);// 粗体
        font.setColor(fontColor);// 字体颜色
        font.setFontHeightInPoints(fontHeight);// 字体大小
        style.setFont(font);
        return style;
    }
 
    /**
     * 设置背景色
     * 
     * @param style
     * @param foregroundCorlor
     * @return CellStyle
     */
    public  CellStyle styleForegroundColor(CellStyle style,short foregroundCorlor) {
        style.setFillForegroundColor(foregroundCorlor);
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);
        return style;
    }
    /**
     * 设置格式
     * 
     * @param wb
     * @param style
     * @param dataFormat 格式
     * @return CellStyle
     */
    public  CellStyle styleDataFormat(Workbook wb,CellStyle style,String dataFormat) {
        DataFormat format = wb.createDataFormat();
        style.setDataFormat(format.getFormat(dataFormat));
        return style;
    }
 
    /**
     * 对齐方式
     * 
     * @param style
     * @param halign
     * @param valign
     * @return CellStyle
     */
    public  CellStyle styleAlignment(CellStyle style, short halign,short valign) {
        style.setAlignment(halign);
        style.setVerticalAlignment(valign);
        return style;
    }
     
    /**
     * 单元格边框
     * @param style
     * @return CellStyle
     */
    public  CellStyle styleFrame(CellStyle style) {
        style.setBorderBottom(CellStyle.BORDER_THIN);
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderLeft(CellStyle.BORDER_THIN);
        style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderRight(CellStyle.BORDER_THIN);
        style.setRightBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderTop(CellStyle.BORDER_THIN);
        style.setTopBorderColor(IndexedColors.BLACK.getIndex());
        return style;
    }
     
     
    /**
     * 合并单元格
     * @param sheet
     * @param firstRow 开始行
     * @param lastRow 最后行
     * @param firstColumn 开始列
     * @param lastColumn 最后列
     */
    public  void mergeCells(Sheet sheet,int firstRow,int lastRow,int firstColumn,int lastColumn) {
        sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstColumn, lastColumn));
    }
 
    /**
     * 设置列宽度
     * @param sheet
     * @param columnIndex 列数
     * @param columnWidth 列宽
     */
    public  void columnWidth(Sheet sheet,Integer columnIndex,Integer columnWidth) {
        if(null != columnWidth && 0 != columnWidth){
            sheet.setColumnWidth(columnIndex, columnWidth);
        }else{
            sheet.setColumnWidth(columnIndex, 500*columnWidth+1000);
        }

    }

}


© 著作权归作者所有

共有 人打赏支持
MLeo
粉丝 9
博文 46
码字总数 6067
作品 0
普陀
程序员
在云端-看世间变幻/fluentexcel

##fluentexcel 简介 fluentexcel基于POI,旨在改进 excel 生成时的编码体验, 借鉴 fluent api 思想开发方便易用,同时书写方便的 excel 的 api。 更重要的是 fluentexcel 可以将一个 excel 20...

在云端-看世间变幻
2015/02/18
0
0
Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表

在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式。不仅仅简单的读取office中的数据.尤其是在生产管理...

长平狐
2012/11/12
1K
0
使用 Apache POI 和 OpenOffice API 在 Linux 中统计 Office 文档的页数

简介: 在实际的项目开发中经常会遇到需要在不同的操作系统平台上统计 Microsoft Office 系列文档页数的要求。Apache POI 提供了一套完整的用于访问微软格式文档的 Java API。但是 Apache P...

IBMdW
2012/10/26
1K
0
java读写excel之POI篇—001

POI 简单介绍 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 是创建和维护操作各种符合Office Open XML(OOXML...

Mysoft
2015/09/21
56
0
使用 Apache POI 处理 Microsoft Office 文档

原文同步至:http://www.waylau.com/apache-poi-handle-microsoft-documents/ POI 概述 Apache POI 项目的使命是创造和维护 Java API 操纵各种格式的文件,其中包括基于 Office Open XML 标准...

waylau
2015/02/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
1
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
2
0
TiDB 在爱奇艺的应用及实践

爱奇艺,中国高品质视频娱乐服务提供者,2010 年 4 月 22 日正式上线,推崇品质、青春、时尚的品牌内涵如今已深入人心,网罗了全球广大的年轻用户群体,积极推动产品、技术、内容、营销等全方...

TiDB
今天
1
0
Web系统大规模并发:电商秒杀与抢购

一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常...

xtof
今天
3
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部