poi低版本工具类换成poi5.2导出excel表头

9 篇文章 0 订阅

之前写的低版本poi 3.8工具是可以用,但是在导出的时候出现问题
所以还是得用高版本工具,原来低版本链接poi低版本导入excel表头

问题

在处理Excel文件时,您可能已经使用了Apache POI库。然而,在使用过程中,您可能会遇到一个常见的错误:java.lang.NoSuchFieldError:Factory。这个错误通常意味着在运行时环境中存在类路径问题或不同版本的POI库冲突

解决办法

我把之前低版本poi 3.8 兼容删除,把里面工具类都换成5.2

最新的工具类

ExcelColorHelper

package com.njry.utils.excel;


import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFColor;


public class ExcelColorHelper {

	public ExcelColorHelper() {
	}


	public static String getHex(short colorIndex) {
//		根据颜色索引获取对应的颜色对象
		IndexedColors indexedColor = IndexedColors.fromInt(colorIndex);
		XSSFColor xssfColor = new XSSFColor(IndexedColors.fromInt(indexedColor.getIndex()), null);
		return xssfColor.getARGBHex();
	}
	public static void main(String[] args)
    {

    }
	
}

ExcelHelper

package com.njry.utils.excel;

import jxl.Cell;
import jxl.Sheet;

public class ExcelHelper {
	public static String getContents(Sheet sheet, int rowIndex, int colIndex) {
		String contents = "";
		try {
			Cell[] cells = sheet.getRow(rowIndex);
			contents = cells[colIndex].getContents().trim();
		} catch (Exception e) {
			contents = "";
		}
		return contents;
	}
}

ExcelToHtml

package com.njry.utils.excel;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

public class ExcelToHtml {
    
    public static Font headFont;
    public static CellStyle headStyle;

    static class HeaderCell {
        public int rowIndex;
        public int colIndex;
        public String text;
        public float width;
        public String bgcolor;
        public String fontColor;
        public String fontHeight;
        public HeaderRegion headerRegion;
        public boolean ascDisplay;
        public boolean descDisplay;
    }

    static class HeaderRegion {
        public int targetRowFrom;
        public int targetRowTo;
        public int targetColumnFrom;
        public int targetColumnTo;
        public String text;
        public int rowLength;
        public int colLength;
    }

    public static String getCellStringValue(Cell cell) {
        DecimalFormat df = new DecimalFormat();
        if(cell == null) {
            return "";
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue().trim();
            case NUMERIC:
                try {
                    return df.parse(String.valueOf(cell.getNumericCellValue())).toString().trim();
                }
                catch (ParseException e) {
                    e.printStackTrace();
                }
            default:
                return "";
        }
    }

    public static HeaderCell[][] excelToHtml(MultipartFile file) {
        ExcelColorHelper colorHelper = new ExcelColorHelper();
        Workbook wb = null;
        try {
            String fileName = file.getOriginalFilename();
            if(fileName.endsWith(".xlsx")) {
            	wb = new XSSFWorkbook(file.getInputStream());
            } else {
                wb = new HSSFWorkbook(file.getInputStream());
            }
        }
        catch (Exception ex) {
        }

        Sheet sheet = wb.getSheetAt(0);

        //获取Sheet中的合并单元格信息
        HeaderRegion[] headerRegions = new HeaderRegion[sheet.getNumMergedRegions()];
        for(int k = 0; k < sheet.getNumMergedRegions(); k++) {
            HeaderRegion headerRegion = null;
            CellRangeAddress region = sheet.getMergedRegion(k);
            headerRegion = new HeaderRegion();
            headerRegion.targetRowFrom = region.getFirstRow();
            headerRegion.targetRowTo = region.getLastRow();
            headerRegion.targetColumnFrom = region.getFirstColumn();
            headerRegion.targetColumnTo = region.getLastColumn();
            headerRegion.text = getCellStringValue(sheet.getRow(region.getFirstRow()).getCell(region.getFirstColumn()));
            headerRegion.colLength = 1 + (region.getLastColumn() - region.getFirstColumn());
            headerRegion.rowLength = 1 + (region.getLastRow() - region.getFirstRow());
            headerRegions[k] = headerRegion;
        }

        //获取Sheet中的单元格信息
        int rowNum = sheet.getPhysicalNumberOfRows();
        int cellNum = sheet.getRow(0).getPhysicalNumberOfCells();
        HeaderCell[][] headerCells = new HeaderCell[rowNum][cellNum];
        Iterator iter = sheet.rowIterator();
        for(int i = 0; iter.hasNext(); i++) {
            HeaderCell headerCell = null;
            Row row = (Row) iter.next();
            int cellNums = row.getPhysicalNumberOfCells();

            for(int j = 0; j < cellNums; j++) {
                headerCell = new HeaderCell();
                Cell cell = row.getCell((short) j);
                headStyle = cell.getCellStyle();
                headFont = wb.getFontAt(cell.getCellStyle().getFontIndex());//得到单元格的字体 
                headerCell.rowIndex = i;
                headerCell.colIndex = j;
                headerCell.text = getCellStringValue(cell);
                headerCell.width = sheet.getColumnWidth((short) j) / 32;
                headerCell.bgcolor = colorHelper.getHex(headStyle.getFillForegroundColor());
                headerCell.fontColor = colorHelper.getHex(headFont.getColor());
                headerCell.fontHeight = String.valueOf(headFont.getFontHeight()/20);

                boolean hasRegion = false;
                for(int k = 0; k < headerRegions.length; k++) {
                    if(i >= headerRegions[k].targetRowFrom && i <= headerRegions[k].targetRowTo
                            && j >= headerRegions[k].targetColumnFrom && j <= headerRegions[k].targetColumnTo) {
                        headerCell.headerRegion = headerRegions[k];
                        hasRegion = true;
                    }
                }
                
                if(!hasRegion) {
                    HeaderRegion headerRegion2 = new HeaderRegion();
                    headerRegion2.targetRowFrom = i;
                    headerRegion2.targetRowTo = i;
                    headerRegion2.targetColumnFrom = j;
                    headerRegion2.targetColumnTo = j;
                    headerRegion2.text = getCellStringValue(sheet.getRow(i).getCell((short) j));
                    headerRegion2.colLength = 1;
                    headerRegion2.rowLength = 1;
                    headerCell.headerRegion = headerRegion2;
                }
                headerCell.ascDisplay = (i == headerCell.headerRegion.targetRowFrom && j == headerCell.headerRegion.targetColumnFrom) ? true : false;
                headerCell.descDisplay = (i == headerCell.headerRegion.targetRowTo && j == headerCell.headerRegion.targetColumnFrom) ? true : false;
                headerCells[i][j] = headerCell;
            }
        }
        return headerCells;
    }

    /**
     * flag -1 :倒序输出 1 正序输出
     * @param headerCells
     * @param flag
     * @return
     */
    public static String getHtmlStr(HeaderCell[][] headerCells, int flag) {

        if(headerCells == null || headerCells.length == 0) {
            return "";
        }
        int rowNum = headerCells.length;
        int cellNum = headerCells[0].length;
        String htmlStr = "";

        int i = 0;
        boolean bool = i < rowNum;
        if(flag == -1) {
            i = rowNum - 1;
            bool = i >= 0;
        }
        while(bool) {
            htmlStr += "<tr>";
            for(int j = 0; j < cellNum; j++) {
                boolean bool_tem = flag == -1 ? headerCells[i][j].descDisplay : headerCells[i][j].ascDisplay;
                if(bool_tem) {
                    htmlStr += "<th style=\"";
                    if(!headerCells[i][j].fontColor.equals("000000")) {
                        if(!headerCells[i][j].fontColor.equals("")) {
                            htmlStr += " color :" + headerCells[i][j].fontColor + ";";
                        }
                    }
                    htmlStr += "\"";
                    if(!headerCells[i][j].bgcolor.equals("FFFFFF")) {
                        if(!headerCells[i][j].bgcolor.equals("")) {
                            htmlStr += " bgcolor =\"" + headerCells[i][j].bgcolor + "\"";
                        }
                    }
					if (headerCells[i][j].headerRegion.colLength <= 1) {
						htmlStr += " width =\"" + headerCells[i][j].width + "\"";
					}
                    if(headerCells[i][j].headerRegion.colLength > 1) {
                        htmlStr += " colspan=" + headerCells[i][j].headerRegion.colLength + " ";
                    }
                    if(headerCells[i][j].headerRegion.rowLength > 1) {
                        htmlStr += " rowspan=" + headerCells[i][j].headerRegion.rowLength + "";
                    }
                    htmlStr += ">" + headerCells[i][j].headerRegion.text + "</th> ";
                }
            }
            htmlStr += "</tr>";
            if(flag == -1) {
                i--;
                bool = i >= 0;
            } else {
                i++;
                bool = i < rowNum;
            }
        }
        return htmlStr;
    }

    public static Map<String, String> getHtmlMap(MultipartFile file) {
        HeaderCell[][] headerCell = excelToHtml(file);
        Map<String, String> htmlMap = new Hashtable<String, String>();
        htmlMap.put("html", getHtmlStr(headerCell, 1));
        return htmlMap;
    }
}

ExcelToHtmlHead

package com.njry.utils.excel;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;

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.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.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

    public class ExcelToHtmlHead {
    
    public static Font headFont;
    public static CellStyle headStyle;

    static class HeaderCell {
        public int rowIndex;
        public int colIndex;
        public String text;
        public float width;
        public String bgcolor;
        public String fontColor;
        public String fontHeight;
        public HeaderRegion headerRegion;
        public boolean ascDisplay;
        public boolean descDisplay;
    }

    static class HeaderRegion {
        public int targetRowFrom;
        public int targetRowTo;
        public int targetColumnFrom;
        public int targetColumnTo;
        public String text;
        public int rowLength;
        public int colLength;
    }

    public static String getCellStringValue(Cell cell) {
        DecimalFormat df = new DecimalFormat();
        if(cell == null) {
            return "";
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue().trim();
            case NUMERIC:
                try {
                    return df.parse(String.valueOf(cell.getNumericCellValue())).toString().trim();
                }
                catch (ParseException e) {
                    e.printStackTrace();
                }
            default:
                return "";
        }
    }

    public static HeaderCell[][] excelToHtml(MultipartFile file) {
        ExcelColorHelper colorHelper = new ExcelColorHelper();
        Workbook wb = null;
        try {
            String fileName = file.getOriginalFilename();
            if(fileName.endsWith(".xlsx")) {
            	wb = new XSSFWorkbook(file.getInputStream());
            } else {
                wb = new HSSFWorkbook(file.getInputStream());
            }
        }
        catch (Exception ex) {
        }

        Sheet sheet = wb.getSheetAt(0);

        //获取Sheet中的合并单元格信息
        HeaderRegion[] headerRegions = new HeaderRegion[sheet.getNumMergedRegions()];
        for(int k = 0; k < sheet.getNumMergedRegions(); k++) {
            HeaderRegion headerRegion = null;
            CellRangeAddress region = sheet.getMergedRegion(k);
            headerRegion = new HeaderRegion();
            headerRegion.targetRowFrom = region.getFirstRow();
            headerRegion.targetRowTo = region.getLastRow();
            headerRegion.targetColumnFrom = region.getFirstColumn();
            headerRegion.targetColumnTo = region.getLastColumn();
            headerRegion.text = getCellStringValue(sheet.getRow(region.getFirstRow()).getCell(region.getFirstColumn()));
            headerRegion.colLength = 1 + (region.getLastColumn() - region.getFirstColumn());
            headerRegion.rowLength = 1 + (region.getLastRow() - region.getFirstRow());
            headerRegions[k] = headerRegion;
        }

        //获取Sheet中的单元格信息
        int rowNum = sheet.getPhysicalNumberOfRows();
        int cellNum = sheet.getRow(0).getPhysicalNumberOfCells();
        HeaderCell[][] headerCells = new HeaderCell[rowNum][cellNum];
        Iterator iter = sheet.rowIterator();
        for(int i = 0; iter.hasNext(); i++) {
            HeaderCell headerCell = null;
            Row row = (Row) iter.next();
            int cellNums = row.getPhysicalNumberOfCells();

            for(int j = 0; j < cellNums; j++) {
                headerCell = new HeaderCell();
                Cell cell = row.getCell((short) j);
                headStyle = cell.getCellStyle();
                headFont = wb.getFontAt(cell.getCellStyle().getFontIndex());//得到单元格的字体 
                headerCell.rowIndex = i;
                headerCell.colIndex = j;
                headerCell.text = getCellStringValue(cell);
                headerCell.width = sheet.getColumnWidth((short) j) / 32;
                headerCell.bgcolor = colorHelper.getHex(headStyle.getFillForegroundColor());
                headerCell.fontColor = colorHelper.getHex(headFont.getColor());
                headerCell.fontHeight = String.valueOf(headFont.getFontHeight()/20);

                boolean hasRegion = false;
                for(int k = 0; k < headerRegions.length; k++) {
                    if(i >= headerRegions[k].targetRowFrom && i <= headerRegions[k].targetRowTo
                            && j >= headerRegions[k].targetColumnFrom && j <= headerRegions[k].targetColumnTo) {
                        headerCell.headerRegion = headerRegions[k];
                        hasRegion = true;
                    }
                }
                
                if(!hasRegion) {
                    HeaderRegion headerRegion2 = new HeaderRegion();
                    headerRegion2.targetRowFrom = i;
                    headerRegion2.targetRowTo = i;
                    headerRegion2.targetColumnFrom = j;
                    headerRegion2.targetColumnTo = j;
                    headerRegion2.text = getCellStringValue(sheet.getRow(i).getCell((short) j));
                    headerRegion2.colLength = 1;
                    headerRegion2.rowLength = 1;
                    headerCell.headerRegion = headerRegion2;
                }
                headerCell.ascDisplay = (i == headerCell.headerRegion.targetRowFrom && j == headerCell.headerRegion.targetColumnFrom) ? true : false;
                headerCell.descDisplay = (i == headerCell.headerRegion.targetRowTo && j == headerCell.headerRegion.targetColumnFrom) ? true : false;
                headerCells[i][j] = headerCell;
            }
        }
        return headerCells;
    }

    /**
     * flag -1 :倒序输出 1 正序输出
     * @param headerCells
     * @param flag
     * @return
     */
    public static String getHtmlStr(HeaderCell[][] headerCells, int flag) {

        if(headerCells == null || headerCells.length == 0) {
            return "";
        }
        int rowNum = headerCells.length;
        int cellNum = headerCells[0].length;
        String htmlStr = "";
        String cellStr = "";
        int i = 0;
        boolean bool = i < rowNum;
        if(flag == -1) {
            i = rowNum - 1;
            bool = i >= 0;
        }
        while(bool) {
            htmlStr += "<tr>";
            cellStr += "";
            for(int j = 0; j < cellNum; j++) {
                boolean bool_tem = flag == -1 ? headerCells[i][j].descDisplay : headerCells[i][j].ascDisplay;
                if(bool_tem) {
                    htmlStr += "<th";
					if (headerCells[i][j].headerRegion.colLength <= 1) {
					    float width = headerCells[i][j].width;
						htmlStr += " width=\"" + new Float(width).intValue() + "\"";
					    //htmlStr += " nowrap ";
					}
                    if(headerCells[i][j].headerRegion.colLength > 1) {
                        htmlStr += " colspan=" + headerCells[i][j].headerRegion.colLength + " ";
                    }
                    if(headerCells[i][j].headerRegion.rowLength > 1) {
                        htmlStr += " rowspan=" + headerCells[i][j].headerRegion.rowLength + "";
                    }
                    htmlStr += ">" + headerCells[i][j].headerRegion.text + "</th> ";
                    if(i == rowNum - 1)
                    {
                        cellStr += headerCells[i][j].headerRegion.text + ">>" + j + ">>" + headerCells[i][j].width + "#";
                    }
                }
            }
            htmlStr += "</tr>";
            if(flag == -1) {
                i--;
                bool = i >= 0;
            } else {
                i++;
                bool = i < rowNum;
            }
        }
        return htmlStr + "@" + cellStr;
    }

    public static Map<String, String> getHtmlMap(MultipartFile file) {
        HeaderCell[][] headerCell = excelToHtml(file);
        Map<String, String> htmlMap = new Hashtable<String, String>();
        htmlMap.put("html", getHtmlStr(headerCell, 1).split("@")[0]);
        htmlMap.put("cell", getHtmlStr(headerCell, 1).split("@")[1]);
        return htmlMap;
    }
}

HssfHelper

package com.njry.utils.excel;

import java.io.FileOutputStream;
import java.text.DecimalFormat;
import java.text.ParseException;

import com.njry.utils.DateHelper;

import org.apache.log4j.Logger;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;;

@SuppressWarnings("deprecation")
public class HssfHelper {
	public HSSFFont headFont;
	public HSSFCellStyle headStyle;
	public HSSFWorkbook wb;
	public final Logger logger = Logger.getLogger(this.getClass());

	@SuppressWarnings("deprecation")
	public HssfHelper() {
		wb = new HSSFWorkbook();
		headFont = wb.createFont();
		headFont.setBold(true);
		headFont.setColor(IndexedColors.BLACK.index);

		headStyle = wb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		headStyle.setAlignment(HorizontalAlignment.CENTER);
	}

	/**
	 * 
	 * @param wb
	 *            excel文件
	 * @param row
	 *            行
	 * @param column
	 *            列号
	 * @param align
	 *            横向对齐方式
	 * @param valign
	 *            纵向对齐方式
	 * @return 格式化后的单元格
	 */
	public HSSFCell createCell(HSSFWorkbook wb, HSSFRow row, int column,
							   int align, int valign) {
		HSSFCell cell = row.createCell((short) column);
		HSSFCellStyle cellStyle = wb.createCellStyle();
		cellStyle.setAlignment(HorizontalAlignment.forInt((short) align));
		cellStyle.setVerticalAlignment(VerticalAlignment.forInt((short) valign));
		cell.setCellStyle(cellStyle);
		//cell.setEncoding((short) 1); // 支持中文导出
		return cell;
	}

	/**
	 * 缺省对齐方式为:居中
	 * 
	 * @param wb
	 * @param row
	 * @param column
	 * @return
	 */
	public HSSFCell createCenterMiddleCell(HSSFWorkbook wb, HSSFRow row,
			int column) {
		HSSFCell cell = row.createCell((short) column);
		HSSFCellStyle cellStyle = wb.createCellStyle();
		cellStyle.setAlignment(HorizontalAlignment.CENTER);
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		cell.setCellStyle(cellStyle);
		//cell.setEncoding((short) 1); // 支持中文导出
		return cell;
	}

	public HSSFCell createCell(HSSFWorkbook wb, HSSFRow row, int column) {
		HSSFCell cell = row.createCell((short) column);
		//cell.setEncoding((short) 1); // 支持中文导出
		return cell;
	}

	public static void main(String args[]) throws Exception {
		HssfHelper hssfHelper = new HssfHelper();
		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet sheet = wb.createSheet("new sheet");
		HSSFRow row = sheet.createRow((short) 2);
		// HSSFCell cell=hssfHelper.createCell(wb, row,
		// 0,HSSFCellStyle.ALIGN_CENTER,HSSFCellStyle.VERTICAL_CENTER);
		HSSFCell cell = hssfHelper.createCell(wb, row, 2);
		cell.setCellValue("中文测试");
		FileOutputStream fileOut = new FileOutputStream("workbook.xls");
		wb.write(fileOut);
		fileOut.close();
	}

	/**
	 * 
	 * @param columnIndex
	 *            列号(从0开始)
	 * @param columnWidth
	 *            列宽
	 */
	public void setColumnWidth(HSSFSheet sheet, int columnIndex, int columnWidth) {
		sheet.setColumnWidth((short) columnIndex, (short) (35.7 * columnWidth));
	}

	public HSSFFont createFont(HSSFWorkbook wb, short boldWeight, short color) {
		HSSFFont font = wb.createFont();
		if (boldWeight != -1)
//			直接给true
			font.setBold(true);
		if (color != -1)
			font.setColor(color);
		return font;
	}

	public HSSFCellStyle createCellStyle(HSSFWorkbook wb, HSSFFont font,
			short valign, short align) {
		HSSFCellStyle cellStyle1 = wb.createCellStyle();
		if (font != null)
			cellStyle1.setFont(font);
		if (valign != -1)
			cellStyle1.setVerticalAlignment(VerticalAlignment.forInt(valign));
		if (align != -1)
			cellStyle1.setAlignment(HorizontalAlignment.forInt(align));
		return cellStyle1;
	}

	public void merge(HSSFSheet sheet, int row1, int col1, int row2, int col2) {
		CellRangeAddress region = new CellRangeAddress(row1, row2, col1, col2);
		sheet.addMergedRegion(region);
	}

	public HSSFRow createRow(HSSFSheet sheet, int rowIndex) {
		HSSFRow row = sheet.createRow(rowIndex);
		return row;
	}


	public String getCellStringValue(HSSFCell cell) {
		DecimalFormat df = new DecimalFormat();
		if (cell == null)
			return "";
		switch (cell.getCellType()) {
		case STRING:
			return cell.getStringCellValue().trim();
		case NUMERIC:
			// 判断是否是日期型的单元格
			if (HSSFDateUtil.isCellDateFormatted(cell)) {
				return new DateHelper().getDateString(cell.getDateCellValue(),
						"yyyy-MM-dd HH:mm:ss");
			} else {
				try {
					return df.parse(String.valueOf(cell.getNumericCellValue()))
							.toString().trim();
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}

		default:
			return "";
		}
	}
}

PoiHelper

package com.njry.utils.excel;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.ParseException;

import com.njry.utils.DateHelper;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

	public class PoiHelper {
	
	public Font headFont;
	public CellStyle headStyle;
	public Workbook wb;
	
	/**
	 * 构造函数
	 */
	public PoiHelper() {
		wb = new HSSFWorkbook();
		headFont = wb.createFont();
		headFont.setBold(true);
		headFont.setColor(IndexedColors.BLACK.index);

		headStyle = wb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		headStyle.setAlignment(HorizontalAlignment.CENTER);
	}

	/**
	 * 构造函数
	 * @param office_type office类型【2003 || 2007】
	 */
	public PoiHelper(String office_type) {
		if(office_type.equals("2003")){
			wb = new HSSFWorkbook();
		} else if(office_type.equals("2007")){
			wb = new XSSFWorkbook();
		}
		headFont = wb.createFont();
		headFont.setBold(true);
		headFont.setColor(IndexedColors.BLACK.index);

		headStyle = wb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		headStyle.setAlignment(HorizontalAlignment.CENTER);
	}
	
	/**
	 * 创建workbook
	 * @param file
	 * @return
	 * @throws IOException
	 */
	public Workbook createWorkBook(File file, String fileName) throws IOException {  
        if(fileName.toLowerCase().endsWith("xls")){  
            return new HSSFWorkbook(new FileInputStream(file));  
        }  
        if(fileName.toLowerCase().endsWith("xlsx")){  
            return new XSSFWorkbook(new FileInputStream(file));  
        }  
        return null;  
    }  

	/**
	 * 创建单元格
	 * @param wb excel文件
	 * @param row 行
	 * @param column 列号
	 * @param align 横向对齐方式
	 * @param valign 纵向对齐方式
	 * @return 格式化后的单元格
	 */
	public Cell createCell(Workbook wb, Row row, int column,
						   int align, int valign) {
		Cell cell = row.createCell(column);
		CellStyle cellStyle = wb.createCellStyle();
		cellStyle.setAlignment(HorizontalAlignment.forInt((short) align));
		cellStyle.setVerticalAlignment(VerticalAlignment.forInt((short) valign));
		cell.setCellStyle(cellStyle);
		return cell;
	}

	/**
	 * 缺省对齐方式为:居中
	 * @param wb
	 * @param row
	 * @param column
	 * @return
	 */
	public Cell createCenterMiddleCell(Workbook wb, Row row,
			int column) {
		Cell cell = row.createCell(column);
		CellStyle cellStyle = wb.createCellStyle();
		cellStyle.setAlignment(HorizontalAlignment.CENTER);
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		cell.setCellStyle(cellStyle);
		return cell;
	}

	public Cell createCell(Workbook wb, Row row, int column) {
		Cell cell = row.createCell(column);
		return cell;
	}

	public static void main(String args[]) throws Exception {
		PoiHelper poiHelper = new PoiHelper();
		Workbook wb = new HSSFWorkbook();
		Sheet sheet = wb.createSheet("new sheet");
		Row row = sheet.createRow((short) 2);
		Cell cell = poiHelper.createCell(wb, row, 2);
		cell.setCellValue("中文测试");
		FileOutputStream fileOut = new FileOutputStream("workbook.xls");
		wb.write(fileOut);
		fileOut.close();
	}

	/**
	 * 
	 * @param columnIndex 列号(从0开始)
	 * @param columnWidth 列宽
	 */
	public void setColumnWidth(Sheet sheet, int columnIndex, int columnWidth) {
		sheet.setColumnWidth((short) columnIndex, (short) (35.7 * columnWidth));
	}

	public Font createFont(Workbook wb, short boldWeight, short color) {
		Font font = wb.createFont();
		if (boldWeight != -1)
			font.setBold(true);
		if (color != -1)
			font.setColor(color);
		return font;
	}

	public CellStyle createCellStyle(Workbook wb, Font font,
			short valign, short align) {
		CellStyle cellStyle1 = wb.createCellStyle();
		if (font != null)
			cellStyle1.setFont(font);
		if (valign != -1)
			cellStyle1.setVerticalAlignment(VerticalAlignment.forInt(valign));
		if (align != -1)
			cellStyle1.setAlignment(HorizontalAlignment.forInt(align));
		return cellStyle1;
	}

	public void merge(Sheet sheet, int row1, int col1, int row2, int col2) {
		sheet.addMergedRegion(new CellRangeAddress(row1, (short) col1, row2, (short) col2));
	}

	public Row createRow(Sheet sheet, int rowIndex) {
		Row row = sheet.createRow(rowIndex);
		return row;
	}

	public String getCellStringValue(Cell cell) {
		DecimalFormat df = new DecimalFormat();
		if (cell == null)
			return "";
		switch (cell.getCellType()) {
		case STRING:
			return cell.getStringCellValue().trim();
		case NUMERIC:
			// 判断是否是日期型的单元格
			if (DateUtil.isCellDateFormatted(cell)) {
				return new DateHelper().getDateString(cell.getDateCellValue(), "yyyy-MM-dd HH:mm:ss");
			} else {
				try {
					return df.parse(String.valueOf(cell.getNumericCellValue())).toString().trim();
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}

		default:
			return "";
		}
	}

	public String getCellCode(int index) {
		String rows = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		if (index / 25 < 1) {
			return String.valueOf(rows.charAt(index));
		} else {
			int cj = index / 26;
			if (cj == 0) {
				return String.valueOf(rows.charAt(index));
			}
			int mod = index % 26;
			return String.valueOf(rows.charAt(cj - 1))
					+ String.valueOf(rows.charAt(mod));

		}
	}

}

XssfHelper

package com.njry.utils.excel;

import java.io.FileOutputStream;
import java.text.DecimalFormat;
import java.text.ParseException;

import com.njry.utils.DateHelper;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

@SuppressWarnings("unchecked")
public class XssfHelper {
	public XSSFFont headFont;
	public XSSFCellStyle headStyle;
	public XSSFWorkbook xb;

	public XssfHelper() {
		xb = new XSSFWorkbook();
		headFont = xb.createFont();
		headFont.setBold(true);
//		headFont.setColor(XSSFColor.BLACK.index);

		headStyle = xb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		headStyle.setAlignment(HorizontalAlignment.CENTER);
	}

	/**
	 * 
	 * @param xb
	 *            excel文件
	 * @param row
	 *            行
	 * @param column
	 *            列号
	 * @param align
	 *            横向对齐方式
	 * @param valign
	 *            纵向对齐方式
	 * @return 格式化后的单元格
	 */
	public XSSFCell createCell(XSSFWorkbook xb, XSSFRow row, int column,
							   int align, int valign) {
		XSSFCell cell = row.createCell((short) column);
		XSSFCellStyle cellStyle = xb.createCellStyle();
		cellStyle.setAlignment(HorizontalAlignment.forInt((short) align));
		cellStyle.setVerticalAlignment(VerticalAlignment.forInt((short) valign));
		cell.setCellStyle(cellStyle);
//		cell.setEncoding((short) 1); // 支持中文导出
		return cell;
	}

	/**
	 * 缺省对齐方式为:居中
	 * 
	 * @param xb
	 * @param row
	 * @param column
	 * @return
	 */
	public XSSFCell createCenterMiddleCell(XSSFWorkbook xb, XSSFRow row,
			int column) {
		XSSFCell cell = row.createCell((short) column);
		XSSFCellStyle cellStyle = xb.createCellStyle();
		cellStyle.setAlignment(HorizontalAlignment.CENTER);
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		cell.setCellStyle(cellStyle);
//		cell.setEncoding((short) 1); // 支持中文导出
		return cell;
	}

	public XSSFCell createCell(XSSFWorkbook xb, XSSFRow row, int column) {
		XSSFCell cell = row.createCell((short) column);
//		cell.setEncoding((short) 1); // 支持中文导出
		return cell;
	}

	public static void main(String args[]) throws Exception {
		XssfHelper xssfHelper = new XssfHelper();
		XSSFWorkbook xb = new XSSFWorkbook();
		XSSFSheet sheet = xb.createSheet("new sheet");
		XSSFRow row = sheet.createRow((short) 2);
		// HSSFCell cell=hssfHelper.createCell(wb, row,
		// 0,HSSFCellStyle.ALIGN_CENTER,HSSFCellStyle.VERTICAL_CENTER);
		XSSFCell cell = xssfHelper.createCell(xb, row, 2);
		cell.setCellValue("中文测试");
		FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");
		xb.write(fileOut);
		fileOut.close();
	}

	/**
	 * 
	 * @param columnIndex
	 *            列号(从0开始)
	 * @param columnWidth
	 *            列宽
	 */
	public void setColumnWidth(XSSFSheet sheet, int columnIndex, int columnWidth) {
		sheet.setColumnWidth((short) columnIndex, (short) (35.7 * columnWidth));
	}

	public XSSFFont createFont(XSSFWorkbook xb, short boldWeight, short color) {
		XSSFFont font = xb.createFont();
		if (boldWeight != -1)
			font.setBold(true);
		if (color != -1)
			font.setColor(color);
		return font;
	}

	public XSSFCellStyle createCellStyle(XSSFWorkbook xb, XSSFFont font,
			short valign, short align) {
		XSSFCellStyle cellStyle1 = xb.createCellStyle();
		if (font != null)
			cellStyle1.setFont(font);
		if (valign != -1)
			cellStyle1.setVerticalAlignment(VerticalAlignment.forInt(valign));
		if (align != -1)
			cellStyle1.setAlignment(HorizontalAlignment.forInt(align));
		return cellStyle1;
	}

	public void merge(XSSFSheet sheet, int row1, int col1, int row2, int col2) {
		sheet.addMergedRegion(new CellRangeAddress(row1, (short) col1, row2,(short) col2));
	}

	public XSSFRow createRow(XSSFSheet sheet, int rowIndex) {
		XSSFRow row = sheet.createRow(rowIndex);
		return row;
	}

	public String getCellStringValue(XSSFCell cell) {
		DecimalFormat df = new DecimalFormat();
		if (cell == null)
			return "";
		switch (cell.getCellType()) {
		case STRING:
			return cell.getStringCellValue().trim();
		case NUMERIC:
			// 判断是否是日期型的单元格HSSFDateUtil.isCellDateFormatted(cell)
			if (DateUtil.isCellDateFormatted(cell)) {
				return new DateHelper().getDateString(cell.getDateCellValue(),
						"yyyy-MM-dd HH:mm:ss");
			} else {
				try {
					return df.parse(String.valueOf(cell.getNumericCellValue()))
							.toString().trim();
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		default:
			return "";
		}
	}


	public String getCellCode(int index) {
		String rows = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		if (index / 25 < 1) {
			return String.valueOf(rows.charAt(index));
		} else {
			int cj = index / 26;
			if (cj == 0) {
				return String.valueOf(rows.charAt(index));
			}
			int mod = index % 26;
			return String.valueOf(rows.charAt(cj - 1))
					+ String.valueOf(rows.charAt(mod));

		}
	}


	public XSSFCell createHeadCell(XSSFWorkbook xb, XSSFRow row, int column) {
		XSSFFont headFont = xb.createFont();
		headFont.setBold(true);
		headFont.setColor(IndexedColors.BLACK.index);
		XSSFCellStyle headStyle = xb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		headStyle.setAlignment(HorizontalAlignment.CENTER);
		XSSFCell cell = row.createCell((short) column);
		//cell.setEncoding((short) 1); // 支持中文导出
		cell.setCellStyle(headStyle);
		return cell;
	}

}

测试controller(依旧是之前的里面代码,但在colorHelper使用稍有不同,不过就是从工具类到controller的poi都换成5.2)

package com.njry.modules.system.rest;


import com.njry.domain.vo.HeaderCell;
import com.njry.domain.vo.HeaderRegion;
import com.njry.modules.system.domain.SysTest;
import com.njry.modules.system.service.SysTestService;
import com.njry.utils.SecurityUtils;
import com.njry.utils.excel.ExcelColorHelper;
import com.njry.utils.excel.HssfHelper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Color;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;

@RestController
@RequiredArgsConstructor
@Api(tags = "工具:本地存储管理")
@RequestMapping("/api/localStorageExcel")
public class testExcelController {

    private final SysTestService sysTestService;

    @PostMapping
    @ApiOperation("上传文件")
    public ResponseEntity<Object> createFile(@RequestParam String name, @RequestParam("file") MultipartFile file){
//        保存导入表头配置
        Map<String, String> mp = new HashMap<String, String>();
        int res = 1;
//        系统获取的用户名
        String currentUsername = SecurityUtils.getCurrentUsername();
        try {
            if (file == null || file.isEmpty()) {
                res = -1;
            }
            HeaderCell[][] headerCells = excelToHtml(file);
            Map cellMap = getHtmlStr(headerCells, 1);//传1 正序
//            获取表头的后处理父子级关系
            List cellList = (List)cellMap.get("cellList");
//            只有正序的时候才能这样使用
            for(int i = 0; i < cellList.size(); i++){
                HashMap<String,Object> hashMap = (HashMap)cellList.get(i);
                if(hashMap.get("rowfrom").equals(0)){
                    hashMap.put("parentLevel",null);
                }else{
//                    判断不是第一行起的父级是谁
                    int rowfrom = convertObjectToInt(hashMap.get("rowfrom")) - 1;
                    int colfrom = convertObjectToInt(hashMap.get("colfrom"));
                    for (int j = 0; j < cellList.size(); j++) {
                        HashMap<String,Object> hashMapInner = (HashMap)cellList.get(j);
                        int rowfrom1 = convertObjectToInt(hashMapInner.get("rowfrom"));
                        int rowto = convertObjectToInt(hashMapInner.get("rowto"));
                        int colfrom1 = convertObjectToInt(hashMapInner.get("colfrom"));
                        int colto = convertObjectToInt(hashMapInner.get("colto"));
                        if(rowfrom >= rowfrom1 && rowfrom <= rowto && colfrom >= colfrom1 && colfrom <= colto){
                            hashMap.put("parentLevel",hashMapInner.get("headid"));
                        }
                    }
                }
            }
            System.out.println(cellList);
            for (int k = 0; k < cellList.size(); k++) {
                HashMap<String,Object> hashMap = (HashMap)cellList.get(k);
                SysTest resources =  new SysTest();
                resources.setColfrom((Integer) hashMap.get("colfrom"));
                resources.setColto((Integer) hashMap.get("colto"));
                resources.setColspan((Integer) hashMap.get("colspan"));
                resources.setRowfrom((Integer) hashMap.get("rowfrom"));
                resources.setRowto((Integer) hashMap.get("rowto"));
                resources.setRowspan((Integer) hashMap.get("rowspan"));
                resources.setTitle((String) hashMap.get("title"));
                resources.setHeadid((String) hashMap.get("headid"));
                resources.setParentlevel((String) hashMap.get("parentLevel"));
                sysTestService.create(resources);
            }
        }catch (Exception e)
            {
                res = 0;
            }
            mp.put("res", res + "");
        return new ResponseEntity<>(HttpStatus.CREATED);
    }


    public int convertObjectToInt(Object obj) {
        if (obj instanceof String) {
            return Integer.parseInt((String) obj);
        } else if (obj instanceof Integer) {
            return (Integer) obj;
        } else {
            throw new IllegalArgumentException("Object cannot be converted to int");
        }
    }



    /**
     * @description 解析表头
     * @author 孙骏 2015-10-23
     * @param file
     * @return
     */
    @SuppressWarnings({"deprecation", "unchecked", "static-access"})
    public HeaderCell[][] excelToHtml(MultipartFile file)
    {
        //开始解析excel
        HssfHelper hssfHelper = new HssfHelper();
        ExcelColorHelper colorHelper = new ExcelColorHelper();
        HSSFWorkbook wb = null;
        Font headFont;
        CellStyle headStyle;
        try
        {
            wb = new HSSFWorkbook(file.getInputStream());
        }
        catch (Exception ex)
        {
        }

        HSSFSheet sheet = wb.getSheetAt(0);

        //获取Sheet中的合并单元格信息(为下文HeaderCell下属性判断使用)
        HeaderRegion[] headerRegions = new HeaderRegion[sheet.getNumMergedRegions()];
        for(int k = 0; k < sheet.getNumMergedRegions(); k++)
        {
            HeaderRegion headerRegion = null;
            CellRangeAddress region = sheet.getMergedRegion(k);
            headerRegion = new HeaderRegion();
            headerRegion.setTargetRowFrom(region.getFirstRow());
            headerRegion.setTargetRowTo(region.getLastRow());
            headerRegion.setTargetColumnFrom(region.getFirstColumn());
            headerRegion.setTargetColumnTo(region.getLastColumn());
            headerRegion.setText(hssfHelper.getCellStringValue(sheet.getRow(region.getFirstRow()).getCell(region.getFirstColumn())));
            headerRegion.setColLength(1 + (region.getLastColumn() - region.getFirstColumn()));
            headerRegion.setRowLength(1 + (region.getLastRow() - region.getFirstRow()));
            headerRegions[k] = headerRegion;
        }

        //获取Sheet中的单元格信息
        int rowNum = sheet.getPhysicalNumberOfRows();
//        获取第一行,得到第一行有多少列,就是excel有多少列
        int cellNum = sheet.getRow(0).getPhysicalNumberOfCells();
        HeaderCell[][] headerCells = new HeaderCell[rowNum][cellNum];
        Iterator iter = sheet.rowIterator();
        for(int i = 0; iter.hasNext(); i++)
        {
            HeaderCell headerCell = null;
            HSSFRow row = (HSSFRow) iter.next();
//            获取每一行高度
            float heightInPoints = row.getHeightInPoints();
//            获取每一行有多少列 physical物理的
            int cellNums = row.getPhysicalNumberOfCells();

            for(int j = 0; j < cellNums; j++)
            {
                headerCell = new HeaderCell();
//                获取到每一行下每一列
                HSSFCell cell = row.getCell((short) j);
                headStyle = cell.getCellStyle();
                headFont = wb.getFontAt(cell.getCellStyle().getFontIndex());//得到单元格的字体
                headerCell.setRowIndex(i);
                headerCell.setColIndex(j);
                headerCell.setText(hssfHelper.getCellStringValue(cell));
                headerCell.setWidth(sheet.getColumnWidth((short) j) / 32);
//                Color fillForegroundColorColor = headStyle.getFillForegroundColorColor();
                short color = headFont.getColor();
                short fillForegroundColor = headStyle.getFillForegroundColor();
                headerCell.setBgcolor(colorHelper.getHex(fillForegroundColor));
                headerCell.setFontColor(colorHelper.getHex(color));
                headerCell.setFontHeight(String.valueOf(headFont.getFontHeight()/20));

                boolean hasRegion = false;
                for(int k = 0; k < headerRegions.length; k++)
                {
//                    判断当前cell是否属于合并单元格 i 在合并单元格之内 同时 j 在合并单元格内(上文headerRegions使用)
                    if(i >= headerRegions[k].getTargetRowFrom() && i <= headerRegions[k].getTargetRowTo()
                            && j >= headerRegions[k].getTargetColumnFrom() && j <= headerRegions[k].getTargetColumnTo())
                    {
                        headerCell.setHeaderRegion(headerRegions[k]);
                        hasRegion = true;
                    }
                }

                if(!hasRegion)
                {
                    HeaderRegion headerRegion2 = new HeaderRegion();
                    headerRegion2.setTargetRowFrom(i);
                    headerRegion2.setTargetRowTo(i);
                    headerRegion2.setTargetColumnFrom(j);
                    headerRegion2.setTargetColumnTo(j);
                    headerRegion2.setText(hssfHelper.getCellStringValue(sheet.getRow(i).getCell((short) j)));
                    headerRegion2.setColLength(1);
                    headerRegion2.setRowLength(1);
                    headerCell.setHeaderRegion(headerRegion2);
                }
//                通过!hasRegion将没有合并的单元格都也有headerRegion,就是自己本身,本身的话下面设置两个变量都是true
//                合并区域的开始行i 和开始列 j 是否是当前单元格的开始行和列
                headerCell.setAscDisplay((i == headerCell.getHeaderRegion().getTargetRowFrom() && j == headerCell.getHeaderRegion().getTargetColumnFrom()) ? true : false);
//                合并区域的结束行i 和开始列 j 是否是当前单元格的开始行和列
                headerCell.setDescDisplay((i == headerCell.getHeaderRegion().getTargetRowTo() && j == headerCell.getHeaderRegion().getTargetColumnFrom()) ? true : false);
                headerCells[i][j] = headerCell;
            }
        }
        return headerCells;
    }

    /**
     * @description 拼接表头样式(报表表头导入)
     * @author 孙骏 2015-10-23
     * @param headerCells
     * @param flag
     * @return
     */
    @SuppressWarnings("unchecked")
    public Map getHtmlStr(HeaderCell[][] headerCells, int flag) {

        if(headerCells == null || headerCells.length == 0) {
            return null;
        }
        Map map = new HashMap();
        int rowNum = headerCells.length;
        int cellNum = headerCells[0].length;
        String htmlStr = "";
        String cellStr = "";
        List cellList = new ArrayList();
        int width = 0;
        Map cellMap = null;
        int i = 0;
        boolean bool = i < rowNum;
        if(flag == -1)
        {
            i = rowNum - 1;
            bool = i >= 0;
        }
        while(bool)
        {
            for(int j = 0; j < cellNum; j++)
            {
//                通过是否是正序(合并单元格开始行,限制列仅为开始)或者倒序,可以排除合并中不是开始的单元格(不必要的循环)
                boolean bool_tem = flag == -1 ? headerCells[i][j].isDescDisplay(): headerCells[i][j].isAscDisplay();
                if(bool_tem)
                {
//                    不是倒数第一和第二行循环
//                    添加随机id,方便后面建立父子级关系
                    String uuid = UUID.randomUUID().toString().replaceAll("-", "");
                    if((i != rowNum - 2) && (i != rowNum - 1))
                    {
                        cellMap = new HashMap();
                        cellMap.put("title", headerCells[i][j].getText());                                  //标题
                        cellMap.put("headid", uuid);                                                        //唯一id
                        cellMap.put("rowfrom", headerCells[i][j].getHeaderRegion().getTargetRowFrom());     //起始行
                        cellMap.put("colfrom", headerCells[i][j].getHeaderRegion().getTargetColumnFrom());  //起始列
                        cellMap.put("rowto", headerCells[i][j].getHeaderRegion().getTargetRowTo());         //目标行
                        cellMap.put("colto", headerCells[i][j].getHeaderRegion().getTargetColumnTo());      //目标列
                        cellMap.put("colspan", headerCells[i][j].getHeaderRegion().getColLength());         //合并列
                        cellMap.put("rowspan", headerCells[i][j].getHeaderRegion().getRowLength());         //合并行
                        cellMap.put("width", headerCells[i][j].getWidth());         //合并行
                        cellList.add(cellMap);
                    }
                    if(i == rowNum - 2) //标题对应英文字段(总行数rowNum不变,i变化,总函数减去2就是倒数第二行)
                    {
                        htmlStr +=  "#" + headerCells[i][j].getHeaderRegion().getText() + ">>" + j;
                        width += new Float(headerCells[i][j].getWidth()).intValue() + 20;
                    }
                    else if(i == rowNum - 1)  //英文字段类型
                    {
                        cellStr += "#" + headerCells[i][j].getHeaderRegion().getText() + ">>" + j;
                    }
                }
            }
            if(flag == -1)
            {
                i--;
                bool = i >= 0;
            }
            else
            {
                i++;
                bool = i < rowNum;
            }
        }
        map.put("htmlStr", htmlStr.substring(1));
        map.put("cellStr", cellStr.substring(1));
        map.put("cellList", cellList);
        map.put("width", width);
        return map;
    }
}

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:下文中的 *** 代表文件名中的版本号。 # 【poi-***.jar中文文档.zip】 中包含: 中文文档:【poi-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【poi-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【poi-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【poi-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【poi-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: poi-***.jar中文文档.zip,java,poi-***.jar,org.apache.poi,poi,***,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,apache,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【poi-***.jar中文文档.zip】,再解压其中的 【poi-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'org.apache.poi', name: 'poi', version: '***' Gradle (Short): implementation 'org.apache.poi:poi:***' Gradle (Kotlin): implementation("org.apache.poi:poi:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` org.apache.poi org.apache.poi.common org.apache.poi.common.usermodel ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` org.apache.poi.EmptyFileException org.apache.poi.EncryptedDocumentException org.apache.poi.OldFileFormatException ...... ```
java_POI教程.pdf javaPOI操作Excel文件.doc POI_API帮助文档.chm poi-bin-3.9-20121203.tar.gz poi帮助.docx POI中文帮助文档.pdf poi中文教程.doc第一章 POI简介 实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。 workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。 POI可以到www.apache.org下载到。实际运行时,需要有poi包就可以了。HSSF提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象: HSSFWorkbook excel的文档对象 HSSFSheet excel的表单 HSSFRow excel的行 HSSFCell excel的格子单元 HSSFFont excel字体 HSSFDataFormat 日期格式 在poi1.7中才有以下2项: HSSFHeader sheet头 HSSFFooter sheet尾(只有打印的时候才能看到效果) 和这个样式 HSSFCellStyle cell样式 辅助操作包括 HSSFDateUtil 日期 HSSFPrintSetup 打印 HSSFErrorConstants 错误信息表 以下可能需要使用到如下的类 import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFFont; 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; 先看poi的examples包中提供的最简单的例子,建立一个空xls文件。 import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class ExcelSample1 { public static void main(String[] args) throws IOException { //创建一个excel文件 HSSFWorkbook wb= new HSSFWorkbook(); FileOutputStream fileOut= new FileOutputStream("c:\\workbook.xls"); // FileOutputStream fileOut= new FileOutputStream("c:/workbook.xls"); wb.write(fileOut); fileOut.close(); } } 通过这个例子,我们在c盘下建立的是一个空白的xls文件(不是空文件)。在此基础上,我们可以进一步看其它的例子。 import org.apache.poi.hssf.usermodel.*; import java.io.FileOutputStream; import java.io.IOException; public class CreateCells { public static void main(String[] args) throws IOException { HSSFWorkbook wb = new HSSFWorkbook(); //建立新HSSFWorkbook对象 HSSFSheet sheet = wb.createSheet("new sheet"); //建立新的sheet对象 HSSFRow row = sheet.createRow((short)0); //在sheet里创建一行,参数为行号(第一行,此处可想象成数组) HSSFCell cell = row.createCell((short)0); //在row里建立新cell(单元格),参数为列号(第一列) cell.setCellvalue(1); //设置cell的整数类型的值 row.createCell((short)1).setCellvalue(1.2); //设置cell浮点类型的值 row.createCell((short)2).setCellvalue("test"); //设置cell字符类型的值 row.createCell((short)3).setCellvalue(true); //设置cell布尔类型的值 HSSFCellStyle cellStyle = wb.createCellStyle(); //建立新的cell样式 cellStyle.setDataFormat(HSSFDataFormat. getBuiltinFormat("m/d/yy h:mm")); //设置cell样式为定制的日期格式 HSSFCell dCell =row.createCell((short)4); dCell.setCellvalue(new Date()); //设置cell为日期类型的值 dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式 HSSFCell csCell =row.createCell((short)5); csCell.setEncoding(HSSFCell.ENCODING_UTF_16); //设置cell编码解决中文高位字节截断 csCell.setCellvalue("中文测试_Chinese Words Test"); //设置中西文结合字符串 row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR); //建立错误cell FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); } } 通过这个例子,我们可以清楚的看到xls文件从大到小包括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。我们可以在cell中设置各种类型的值。 尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。 其他测试可以通过参考examples包中的测试例子掌握poi的详细用法,包括字体的设置,cell大小和低纹的设置等。需要注意的是POI是一个仍然在完善中的公开代码的项目,所以有些功能正在不断的扩充。 感觉上面的操作比较的繁琐,然后就自己写了一个方法。这个方法不需要事先创建row和cell,直接进行cteateCell就可以了,在程序中会自动进行判断,如果不存在的话会创建。 private static void cteateCell(HSSFWorkbook wb,HSSFRow row,short col,short align,String val){ HSSFCell cell = row.createCell(col); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(val); HSSFCellStyle cellstyle = wb.createCellStyle(); cellstyle.setAlignment(align); cell.setCellStyle(cellstyle); } 对里面的几个参数的说明: short col 应该是你的cell单元格的位置也就是列号; short align 应该是你的对齐方式; String val 应该是你单元格里面要添加的值; 具体的调用如下: HSSFRow row = sheet.createRow((short)1); cteateCell(wb,row,(short)0,HSSFCellStyle.ALIGN_CENTER_SELECTION,"SampleID"); 在上边的例子里我们看到了要设置一个单元格里面信息的格式(例如,要将信息居中)设置的操作如下: HSSFCellStyle cellstyle = wb.createCellStyle(); cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION); cell.setCellStyle(cellstyle); 还有我们我们经常会用到的合并单元格,在这里我们也有这样的操作,代码如下: sheet.addMergedRegion(new Region(1,(short)1,2,(short)4)); 这里面我们还要介绍一个经常会遇到的问题,就是怎么来冻结一个窗口。poi也为我们集成了这样的事情了。代码如下: sheet.createFreezePane(1,2);  在这里我们需要注意的是 一、 该方法是在一个具体的sheet里面来进行操作。 二、 方法createFreezepane;有2个参数。前一个参数代表列;后一个参数代表行。 上边的代码对应的excel文件如下: 我么在画面上看到了明显的两条黑线,这就是冻结的窗口。 然后我们来看一个完整的STRUTS的小例子,在这个例子里面我们要做的事情是要模拟移动公司的网上营业厅里面的一个功能,我们要把一个客户当月的通话记录和各种信息查询出来,并且生成一张excel报表。首先,我们来看一下网上效果的截图。
### 回答1: Java POI是一个用于操作Microsoft Office格式文件的Java API,包括Excel、Word和PowerPoint等文件。使用Java POI可以轻松地读取、写入和操作Excel文件。 导出Excel工具类是基于Java POI开发的一种工具,可以将Java程序中的数据导出Excel文件中。该工具类通常包括以下功能: 1. 创建Excel文件和工作表 2. 设置Excel文件和工作表的属性,如标题、列宽、行高等 3. 写入数据到Excel文件中,包括文本、数字、日期、图片等 4. 格式化Excel文件中的数据,如设置单元格的字体、颜色、边框等 5. 导出Excel文件到本地磁盘或网络路径中 使用导出Excel工具类可以方便地将Java程序中的数据导出Excel文件中,便于数据的查看和分析。 ### 回答2: Java POI是由Apache基金会开发的一个开源的Java API,它可以帮助Java开发人员轻松地读写Microsoft Office格式的文件,其中包括Excel、Word和PowerPoint。其中Excel是最常用的一个,而Java POI提供了一种方便的方法导出Excel,使开发人员的工作变得更加高效。 Java POI导出Excel工具类的实现原理是利用POI库提供的API来操作Excel文件。首先,需要创建一个Workbook对象,它代表了整个Excel文件,然后再创建Sheet对象,它代表了Excel文件中的一个工作簿。接着,需要往Sheet对象中添加行和列,以及单元格值,并设置单元格的样式,最后将数据写入到Excel文件,并进行文件保存。 在实际开发中,通常会创建一个工具类来处理Excel文件的导入和导出,以提高代码的复用性和可维护性。导出Excel工具类通常包含以下几个方法: 1. 创建Workbook对象:使用POI库创建Workbook对象,设置Excel文件的格式和样式等属性。 2. 创建Sheet对象:使用POI库创建Sheet对象,设置Sheet的名称、列头信息和单元格样式等属性。 3. 添加数据行:将数据逐行添加到Sheet对象中,并设置单元格样式,以保证输出的Excel文件具有良好的可读性。 4. 写入数据:将Sheet对象中的数据写入到Excel文件中,可以选择将文件保存到本地磁盘或者将文件发送给客户端。 总的来说,Java POI导出Excel工具类可以方便地实现Excel文件的生成,提高了开发效率和程序的可靠性,是Java开发人员不可或缺的工具之一。 ### 回答3: Java POI是一种用来读写Microsoft Office格式文件的Java API,其中包括Excel,Word和PowerPoint文档。导出Excel文件是Java开发过程中常见的需求,Java POI提供了丰富的API,使得开发者们可以方便快捷地实现导出Excel文件的功能。下面将介绍java poi导出excel工具类的实现步骤。 1. 引入POI库 使用Maven或Gradle工具,可以轻松地在项目中引入POI库。引入完毕后,即可在代码中使用POI API。 2. 创建工具类Java工程中创建一个名为 ExcelUtil 的类,该类负责导出Excel文件。 3. 编写导出Excel的方法 在 ExcelUtil 类中,编写导出 Excel 文件的方法。 该方法主要包括创建工作簿,创建工作表,设置表头,将数据写入表格,设置单元格样式和导出文件等步骤。接下来,分别介绍每个步骤的实现方法。 (1)创建工作簿 在导出 Excel 文件时,首先需要创建一个工作簿。可以通过 HSSFWorkbook 或 XSSFWorkbook 类来创建工作簿。使用 XSSFWorkbook 类可以创建 .xlsx 格式的 Excel 文件,而使用 HSSFWorkbook 类可以创建 .xls 格式的 Excel 文件。 (2)创建工作表 除了创建工作簿之外,还需要在工作簿中创建工作表。可以使用 createSheet() 方法创建工作表。 (3)设置表头 表头Excel 文件中的第一行,通常包含各个列的名称。可以使用 createRow() 方法创建表头行,并使用 createCell() 方法在行中创建单元格。 (4)将数据写入表格 接下来,需要将数据写入工作表中。可以通过循环遍历来逐行写入数据。典型的情况是,读取一个链表,然后将链表中的元素逐一写入 Excel 文件。 (5) 设置单元格样式 可以创建一个单元格样式类,设置单元格的底色、字体颜色、字体大小、对齐方式、边框等属性。 (6)导出文件 将创建好的工作簿写入输出流中,即可将 Excel 文件导出到文件系统或应用程序的输出流中。 4. 调用导出方法 最后,在需要导出 Excel 文件的地方,向 ExcelUtil 类传递数据并调用导出方法即可实现导出文件的功能。 以上就是介绍 java poi导出excel工具类的实现方式。使用 Java POI API,可以快速方便地将数据导出Excel 文件中。开发者们可以根据实际需求进行二次开发,实现更多的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值