poi低版本导入excel表头

参考引入低版本的poi不和原来项目高版本冲突

定义两个实体类HeaderCell和HeaderRegion

java 复制代码
package com.njry.domain.vo;


import lombok.Data;

/**
 * @description 标题的单元格属性
 * @author 大佬
 * @date 2015-10-16 
 */
@Data
public class HeaderCell 
{
    private int rowIndex;                      //单元格第几行
    private int colIndex;                      //单元格第几列
    private String text;                       //单元格的值
    private float width;                       //单元格宽度
    private String bgcolor;                    //单元格背景色
    private String fontColor;                  //字体颜色
    private String fontHeight;                 //字体大小
    private HeaderRegion headerRegion;         //合并单元格信息
//    private boolean isRegion;                  //是否属于合并单元格
    private boolean ascDisplay;                //正序输出
    private boolean descDisplay;               //倒序输出
}
java 复制代码
package com.njry.domain.vo;

import lombok.Data;

/**
 * @description excel的sheet中的合并单元格信息
 * @author 大佬
 * @date 2015-10-16 
 */
@Data
public class HeaderRegion 
{
    private int targetRowFrom;         //起始行数
    private int targetRowTo;           //目标行数
    private int targetColumnFrom;      //起始列数
    private int targetColumnTo;        //目标列数
    private String text;               //单元格的值
    private int rowLength;             //占用总行数
    private int colLength;             //占用总列数
    
}

精简前辈的工具类(方面后面导入使用,有几个没用到我也放在这里的)

先引入工具类依赖(在pom中)

java 复制代码
    <properties>
        <jxls.version>1.0.6</jxls.version>
        <jxl.version>2.6.12</jxl.version>
    </properties>
      <!-- 添加jxls依赖 -->
        <dependency>
            <groupId>net.sf.jxls</groupId>
            <artifactId>jxls-core</artifactId>
            <version>${jxls.version}</version>
        </dependency>


        <!-- 添加jxl依赖 -->
        <dependency>
            <groupId>net.sourceforge.jexcelapi</groupId>
            <artifactId>jxl</artifactId>
            <version>${jxl.version}</version>
        </dependency>

因为版本冲突,所以最后poi都是我改了之后的低版本poi(工具类都是注释默认高版本,引入低版本)

ExcelToHtmlHead

java 复制代码
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;
import shade.org.apache.poi.hssf.usermodel.HSSFWorkbook;
import shade.org.apache.poi.ss.usermodel.*;
import shade.org.apache.poi.ss.util.CellRangeAddress;
import shade.org.apache.poi.xssf.usermodel.XSSFWorkbook;

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 Cell.CELL_TYPE_STRING:
                return cell.getStringCellValue().trim();
            case Cell.CELL_TYPE_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;
    }
}

ExcelHelper

java 复制代码
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

java 复制代码
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;
import shade.org.apache.poi.hssf.usermodel.HSSFWorkbook;
import shade.org.apache.poi.ss.usermodel.*;
import shade.org.apache.poi.ss.util.CellRangeAddress;
import shade.org.apache.poi.xssf.usermodel.XSSFWorkbook;

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 Cell.CELL_TYPE_STRING:
                return cell.getStringCellValue().trim();
            case Cell.CELL_TYPE_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

java 复制代码
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;
import shade.org.apache.poi.hssf.usermodel.HSSFWorkbook;
import shade.org.apache.poi.ss.usermodel.*;
import shade.org.apache.poi.ss.util.CellRangeAddress;
import shade.org.apache.poi.xssf.usermodel.XSSFWorkbook;

    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 Cell.CELL_TYPE_STRING:
                return cell.getStringCellValue().trim();
            case Cell.CELL_TYPE_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(使用了,涉及sql没删除全)

java 复制代码
package com.njry.utils.excel;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.njry.utils.DateHelper;
import com.njry.utils.StringUtils;
import jxl.Workbook;
import jxl.format.BorderLineStyle;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import net.sf.jxls.transformer.XLSTransformer;

import org.apache.log4j.Logger;

import org.springframework.web.multipart.MultipartFile;
import shade.org.apache.poi.hssf.usermodel.*;
import shade.org.apache.poi.hssf.util.HSSFColor;
import shade.org.apache.poi.hssf.util.Region;

//import web.service.BaseService;

@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.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		headFont.setColor(HSSFColor.BLACK.index);

		headStyle = wb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		headStyle.setAlignment(HSSFCellStyle.ALIGN_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((short) align);
		cellStyle.setVerticalAlignment((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(HSSFCellStyle.ALIGN_CENTER);
		cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_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");
		System.out.println("BOLD:" + HSSFFont.BOLDWEIGHT_BOLD);
		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)
			font.setBoldweight(boldWeight);
		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(valign);
		if (align != -1)
			cellStyle1.setAlignment(align);
		return cellStyle1;
	}

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

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

	/**
	 * eg: new HssfHelper().export(list, new String[][]{ {"用户号码", "MSISDN"},
	 * {"姓名", "NAME"}, {"投诉类型", "COMPLAIN_TYPE"}, {"工单流水号","TASKNO"},
	 * {"录音流水号","RECORDNO"}, {"投诉事由","COMPLAIN_CONTENT"}});
	 * 
	 * @param list
	 * @param map
	 * @return
	 */
	public HSSFWorkbook export(List list, String[][] map, String sheetName) {
		HssfHelper hssfHelper = new HssfHelper();
		HSSFSheet sheet = wb.createSheet(sheetName);
		HSSFRow row = sheet.createRow((short) 0);
		HSSFCell cell = null;
		for (int i = 0; i < map.length; i++) {
			cell = hssfHelper.createCell(wb, row, i);
			cell.setCellStyle(headStyle);
			cell.setCellValue(map[i][0]);
		}
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i + 1);
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				hssfHelper.createCell(wb, row, j).setCellValue(
						StringUtils.notEmpty(hash.get(map[j][1])));
			}
		}
		return wb;
	}

	public HSSFWorkbook export2(List list, String[][] map, String sheetName) {
		HssfHelper hssfHelper = new HssfHelper();
		HSSFSheet sheet = wb.createSheet(sheetName);
		HSSFRow row = sheet.createRow((short) 0);
		HSSFCell cell = null;
		for (int i = 0; i < map.length; i++) {
			cell = hssfHelper.createCell(wb, row, i);
			cell.setCellStyle(headStyle);
			cell.setCellValue(map[i][0]);
		}
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i + 1);
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				if (map[j][2].equals("double")) {
					if (!StringUtils.notEmpty(hash.get(map[j][1])).equals("")) {
						hssfHelper.createCell(wb, row, j).setCellValue(
								Double.valueOf(StringUtils
										.notEmpty(hash.get(map[j][1]))));
					}
				} else {
					hssfHelper.createCell(wb, row, j).setCellValue(
							StringUtils.notEmpty(hash.get(map[j][1])));
				}
			}
		}
		return wb;
	}

	public HSSFWorkbook exportNumber(List list, String[][] map, String sheetName) {
		HssfHelper hssfHelper = new HssfHelper();
		HSSFSheet sheet = wb.createSheet(sheetName);
		HSSFRow row = sheet.createRow((short) 0);
		HSSFCell cell = null;
		for (int i = 0; i < map.length; i++) {
			cell = hssfHelper.createCell(wb, row, i);
			cell.setCellStyle(headStyle);
			cell.setCellValue(map[i][0]);
		}
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i + 1);
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				try {
					hssfHelper.createCell(wb, row, j).setCellValue(
							Float.valueOf(StringUtils.notEmpty(hash.get(map[j][1]))));
				} catch (Exception e) {
					hssfHelper.createCell(wb, row, j).setCellValue(
							StringUtils.notEmpty(hash.get(map[j][1])));
				}
			}
		}
		return wb;
	}

	public HSSFWorkbook exportByPageSize(List list, String[][] map, int pageSize) {
		if (pageSize <= 0)
			pageSize = 65530;
		HssfHelper hssfHelper = new HssfHelper();
		HSSFSheet sheet = null;
		HSSFRow row = null;
		HSSFCell cell = null;

		int currPage = 0;
		int pages = list.size() / pageSize + 1;
		for (int i = 0; i < list.size(); i++) {
			if (i % pageSize == 0) {
				int currPageSize = currPage == pages - 1 ? pageSize * currPage
						+ list.size() % pageSize : pageSize * (currPage + 1);
				String sheetName = (pageSize * currPage + 1) + "~"
						+ currPageSize;
				sheet = wb.createSheet(sheetName);
				row = sheet.createRow((short) 0);
				for (int j = 0; j < map.length; j++) {
					cell = hssfHelper.createCell(wb, row, j);
					cell.setCellStyle(headStyle);
					cell.setCellValue(map[j][0]);
				}
				currPage++;
			}
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				row = sheet.createRow((short) (i % pageSize) + 1);
				hssfHelper.createCell(wb, row, j).setCellValue(
						StringUtils.notEmpty(hash.get(map[j][1])));
			}
		}
		return wb;
	}


	public String getCellStringValue(HSSFCell cell) {
		DecimalFormat df = new DecimalFormat();
		if (cell == null)
			return "";
		switch (cell.getCellType()) {
		case HSSFCell.CELL_TYPE_STRING:
			return cell.getStringCellValue().trim();
		case HSSFCell.CELL_TYPE_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 "";
		}
	}


	public HSSFWorkbook export(List list, String sheet_name) {
		HssfHelper hssfHelper = new HssfHelper();
		HSSFSheet sheet = wb.createSheet(sheet_name);
		HSSFRow row;
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i);
			Map map = (Map) list.get(i);
			Object[] values = map.values().toArray();
			for (int j = 0; j < values.length; j++) {
				hssfHelper.createCell(wb, row, j).setCellValue(
						StringUtils.notEmpty(values[j]));
			}
		}
		return wb;
	}

	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));

		}
	}
	/**
	 * 通过给定的模板导出
	 * @param dataList 
	 * @param filename 文件名 
	 * @param dir_get 获取模板的路径 
	 * @param dir_to 保存文件的路径
	 * @throws Exception
	 */
	public void exportBytemplet(List dataList,String filename,String dir_get,String dir_to) throws Exception {
//		Map beans = new HashMap();
//		beans.put("dataList", dataList);
//		XLSTransformer transformer = new XLSTransformer();
//		InputStream is = null;
//		try {
//			is = new BufferedInputStream(new FileInputStream(dir_get));
//			HSSFWorkbook workbook = transformer.transformXLS(is, beans);
//			FileOutputStream out=new FileOutputStream(dir_to+filename);
//			workbook.write(out);
//			is.close();
//			out.flush();
//			out.close();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
	}
	

	public void export(List list, HSSFSheet sheet) {
		HssfHelper hssfHelper = new HssfHelper();
		HSSFRow row;
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i);
			Map map = (Map) list.get(i);
			Object[] values = map.values().toArray();
			for (int j = 0; j < values.length; j++) {
				hssfHelper.createCell(wb, row, j).setCellValue(
						StringUtils.notEmpty(values[j]));
			}
		}
	}
	
	public HSSFCell createHeadCell(HSSFWorkbook wb, HSSFRow row, int column) {
    	HSSFFont headFont = wb.createFont();
		headFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		headFont.setColor(HSSFColor.BLACK.index);
		HSSFCellStyle headStyle = wb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        HSSFCell cell = row.createCell((short)column);
        cell.setCellStyle(headStyle);
        return cell;
    }
	
	public void export2(HSSFWorkbook wb, List list, String[][] map, int headRows, int headCols, int sheetIndex) {
		HssfHelper hssfHelper = new HssfHelper(); 
		HSSFSheet sheet = wb.getSheetAt(sheetIndex);
		HSSFRow row = null; 
		HSSFCell cell = null;
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i + headRows);
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				cell = hssfHelper.createCell(wb, row, j + headCols); 
				String val = StringUtils.notEmpty(hash.get(map[j][0]));
				if(map[j][1].equals("double")){
					if(!val.equals("")){
						cell.setCellValue(Double.valueOf(val));
					}				
				} else if(map[j][1].equals("date")) {//传入完整日期date类型字段,去除最后的.0后缀
					if(!val.equals("")){
						val = val.substring(0, val.length()-2);
						System.out.println(val);
						cell.setCellValue(val);
					}	
				} else{
					cell.setCellValue(val);
				}
			}
		}
	}
	
	/**
	 * 校验Excel表头
	 * @param file 导入的文件
	 * @param titles 正确表头字符串数组
	 * @param sheet_index 表索引 从0开始
	 * @param row_index 行索引 从0开始
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public String checkExcelHead(MultipartFile file, String[] titles, int sheet_index, int row_index) 
	{
		String message = "";
		if (file == null || file.getSize() == 0) 
		{
			message = "导入错误:文件不存在或文件大小为0!";
			return message;
		}
        
        try 
        {
        	HSSFWorkbook wb = new HSSFWorkbook(file.getInputStream());
            HSSFSheet sheet = wb.getSheetAt(0);
            if (sheet == null) 
            {
            	message = "导入错误:未找到sheet!";
            }
            else
            {
            	HSSFRow row = wb.getSheetAt(sheet_index).getRow(row_index);
            	if (row == null) 
            	{
            		message = "Excel标题列加载错误:没有标题列!";
            		return message;
            	}
            	
            	int cols = row.getPhysicalNumberOfCells();
            	if (cols != titles.length) 
            	{
            		message = "导入错误:导入的Excel必须为" + titles.length + "列!";
            		return message;
            	}
            	
            	for (int i = 0; i < cols; i++) 
            	{
            		HSSFCell cell = row.getCell((short) i);
            		String cellValue = this.getCellStringValue(cell);
            		if (!cellValue.equals(titles[i])) 
            		{
            			message = "导入错误:Excel第" + this.getCellCode(i) + "列列名必须为"" + titles[i] + ""!";
            			break;
            		}
            	}
            	
            }
        
        }
        catch(Exception e)
        {
            message = "导入错误:文件读取异常!";
        }
        
		return message;
	}

    /**
     * 创建临时表SQL 
     * @author 戴晓飞 2013-11-03
     * @param tempTableName
     * @param paramsStr
     * @return
     */
    public String getCreateSql(String tempTableName, String[] paramsStr, boolean orderFlag)
    {
    	String createSql = "create table " + tempTableName + "(";
        StringBuffer field = new StringBuffer("");	// 字段串
        for(String param : paramsStr)
        {
        	String[] temp = param.split(",");
        	field.append(temp[1] + " varchar(4000),");
        }
        // 拼接创建的SQL语句
        if(orderFlag)
        {
        	createSql = createSql + field.toString() + " decription varchar2(4000), show_order number)";
        }
        else
        {
        	createSql = createSql + field.deleteCharAt(field.length() - 1) + " , decription varchar2(4000)) ";
        }
        logger.debug("插入临时表的SQL语句:" + createSql);
        return createSql;
    }
    
    /**
     * 插入临时表的SQL语句
     * @author 戴晓飞 2013-11-03
     * @param tempTableName
     * @param paramsStr
     * @return
     */
    public String getInsertSql(String tempTableName, String[] paramsStr, boolean orderFlag)
    {
    	String insertSql = "";
        StringBuffer field = new StringBuffer("");	  // 字段串
        StringBuffer quesMark = new StringBuffer(""); // 占位符串
        for(String param : paramsStr)
        {
        	String[] temp = param.split(",");
        	field.append(temp[1] + ",");
        	quesMark.append("?,");
        }
        // 顺序标志为true,则字段串加show_order字段,占位符串增加一个占位符
        if(orderFlag)
        {
        	field.append("show_order");
        	quesMark.append("?");
        }
        else
        {
        	field.deleteCharAt(field.length() - 1); // 去掉字段串末尾的逗号
        	quesMark.deleteCharAt(quesMark.length() - 1); // 去掉占位符串末尾的逗号
        }
        // 拼接插入的SQL语句
        insertSql = "insert into " + tempTableName + "(" + field.toString() + ") values(" + quesMark.toString() + ")";
        logger.debug("拼接插入的SQL语句:" + insertSql);
        return insertSql;
    }

    
    public void export3(HSSFWorkbook wb, List list, String[][] map, int headRows, int headCols, int sheetIndex) {
        HssfHelper hssfHelper = new HssfHelper(); 
        HSSFSheet sheet = wb.getSheetAt(sheetIndex);
        HSSFRow row = null; 
        HSSFCell cell = null;
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        for (int i = 0; i < list.size(); i++) {
            row = sheet.createRow((short) i + headRows);
            Map hash = (Map) list.get(i);
            for (int j = 0; j < map.length; j++) {
                cell = hssfHelper.createCell(wb, row, j + headCols); 
                String val = StringUtils.notEmpty(hash.get(map[j][0]));
                if(map[j][1].equals("double")){
                    if(!val.equals("")){
                        cell.setCellValue(Double.valueOf(val));
                    }               
                } else if(map[j][1].equals("date")) {//传入完整日期date类型字段,去除最后的.0后缀
                    if(!val.equals("")){
                        val = val.substring(0, val.length()-2);
                        cell.setCellValue(val);
                    }   
                } else{
                    cell.setCellValue(val);
                }
                cell.setCellStyle(cellStyle);
            }
        }
    }
    
    public void exportWithWatermark(HSSFWorkbook wb, List list, String[][] map, int headRows, int headCols, int sheetIndex)
    {
        HssfHelper hssfHelper = new HssfHelper(); 
        HSSFSheet sheet = wb.getSheetAt(sheetIndex);
        HSSFRow row = null; 
        HSSFCell cell = null;
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        for (int i = 0; i < list.size(); i++) {
            row = sheet.createRow((short) i + headRows);
            Map hash = (Map) list.get(i);
            for (int j = 0; j < map.length; j++) {
                cell = hssfHelper.createCell(wb, row, j + headCols); 
                String val = StringUtils.notEmpty(hash.get(map[j][0]));
                if(map[j][1].equals("double")){
                    if(!val.equals("")){
                        cell.setCellValue(Double.valueOf(val));
                    }               
                } else if(map[j][1].equals("date")) {//传入完整日期date类型字段,去除最后的.0后缀
                    if(!val.equals("")){
                        val = val.substring(0, val.length()-2);
                        cell.setCellValue(val);
                    }   
                } else{
                    cell.setCellValue(val);
                }
                cell.setCellStyle(cellStyle);
            }
        }
    }
}

PoiHelper

java 复制代码
package com.njry.utils.excel;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.njry.utils.DateHelper;
import com.njry.utils.StringUtils;
import net.sf.jxls.transformer.XLSTransformer;
import shade.org.apache.poi.hssf.usermodel.HSSFCellStyle;
import shade.org.apache.poi.hssf.usermodel.HSSFFont;
import shade.org.apache.poi.hssf.usermodel.HSSFWorkbook;
import shade.org.apache.poi.hssf.util.HSSFColor;
import shade.org.apache.poi.ss.usermodel.*;
import shade.org.apache.poi.ss.util.CellRangeAddress;
import shade.org.apache.poi.xssf.usermodel.XSSFWorkbook;
//import org.apache.poi.hssf.usermodel.HSSFCellStyle;
//import org.apache.poi.hssf.usermodel.HSSFFont;
//import org.apache.poi.hssf.usermodel.HSSFWorkbook;
//import org.apache.poi.hssf.util.HSSFColor;
//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.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		headFont.setColor(HSSFColor.BLACK.index);

		headStyle = wb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		headStyle.setAlignment(HSSFCellStyle.ALIGN_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.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		headFont.setColor(HSSFColor.BLACK.index);

		headStyle = wb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		headStyle.setAlignment(HSSFCellStyle.ALIGN_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((short) align);
		cellStyle.setVerticalAlignment((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(HSSFCellStyle.ALIGN_CENTER);
		cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_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");
		System.out.println("BOLD:" + HSSFFont.BOLDWEIGHT_BOLD);
		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.setBoldweight(boldWeight);
		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(valign);
		if (align != -1)
			cellStyle1.setAlignment(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;
	}

	/**
	 * eg: new PoiHelper().export(list, new String[][]{ {"用户号码", "MSISDN"},
	 * 				{"姓名", "NAME"}}, "sheet名称", "2003");
	 * @param list 数据
	 * @param map 数据键值对
	 * @param sheetName sheet名称
	 * @param office_type office类型【2003 || 2007】
	 * @return
	 */
	public Workbook export(List list, String[][] map, String sheetName, String office_type) {
		PoiHelper poiHelper = new PoiHelper(office_type);
		Sheet sheet = wb.createSheet(sheetName);
		Row row = sheet.createRow((short) 0);
		Cell cell = null;
		for (int i = 0; i < map.length; i++) {
			cell = poiHelper.createCell(wb, row, i);
			cell.setCellStyle(headStyle);
			cell.setCellValue(map[i][0]);
		}
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i + 1);
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				poiHelper.createCell(wb, row, j).setCellValue(
						StringUtils.notEmpty(hash.get(map[j][1])));
			}
		}
		return wb;
	}

	public Workbook export2(List list, String[][] map, String sheetName, String office_type) {
		PoiHelper poiHelper = new PoiHelper(office_type);
		Sheet sheet = wb.createSheet(sheetName);
		Row row = sheet.createRow((short) 0);
		Cell cell = null;
		for (int i = 0; i < map.length; i++) {
			cell = poiHelper.createCell(wb, row, i);
			cell.setCellStyle(headStyle);
			cell.setCellValue(map[i][0]);
		}
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i + 1);
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				if (map[j][2].equals("double")) {
					if (!StringUtils.notEmpty(hash.get(map[j][1])).equals("")) {
						poiHelper.createCell(wb, row, j).setCellValue(
								Double.valueOf(StringUtils
										.notEmpty(hash.get(map[j][1]))));
					}
				} else {
					poiHelper.createCell(wb, row, j).setCellValue(
							StringUtils.notEmpty(hash.get(map[j][1])));
				}
			}
		}
		return wb;
	}


	public String getCellStringValue(Cell cell) {
		DecimalFormat df = new DecimalFormat();
		if (cell == null)
			return "";
		switch (cell.getCellType()) {
		case Cell.CELL_TYPE_STRING:
			return cell.getStringCellValue().trim();
		case Cell.CELL_TYPE_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 Workbook export(List list, String sheet_name, String office_type) {
		PoiHelper poiHelper = new PoiHelper(office_type);
		Sheet sheet = wb.createSheet(sheet_name);
		Row row;
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i);
			Map map = (Map) list.get(i);
			Object[] values = map.values().toArray();
			for (int j = 0; j < values.length; j++) {
				poiHelper.createCell(wb, row, j).setCellValue(
						StringUtils.notEmpty(values[j]));
			}
		}
		return wb;
	}

	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));

		}
	}
	/**
	 * 通过给定的模板导出
	 * @param dataList 
	 * @param filename 文件名 
	 * @param dir_get 获取模板的路径 
	 * @param dir_to 保存文件的路径
	 * @throws Exception
	 */
	public void exportBytemplet(List dataList,String filename,String dir_get,String dir_to) throws Exception {
		Map beans = new HashMap();
		beans.put("dataList", dataList);
		XLSTransformer transformer = new XLSTransformer();
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(dir_get));
			Workbook workbook = (Workbook) transformer.transformXLS(is, beans);
			FileOutputStream out=new FileOutputStream(dir_to+filename);
			workbook.write(out);
			is.close();
			out.flush();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

XssfHelper

java 复制代码
package com.njry.utils.excel;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.njry.utils.DateHelper;
import com.njry.utils.StringUtils;
import net.sf.jxls.transformer.XLSTransformer;

//import org.apache.poi.hssf.usermodel.HSSFWorkbook;
//import org.apache.poi.hssf.util.HSSFColor;
//import org.apache.poi.ss.usermodel.DateUtil;
//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;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;
import shade.org.apache.poi.hssf.usermodel.HSSFWorkbook;
import shade.org.apache.poi.hssf.util.HSSFColor;
import shade.org.apache.poi.ss.usermodel.DateUtil;
import shade.org.apache.poi.ss.util.CellRangeAddress;
import shade.org.apache.poi.xssf.usermodel.*;

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

	public XssfHelper() {
		xb = new XSSFWorkbook();
		headFont = xb.createFont();
		headFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
//		headFont.setColor(XSSFColor.BLACK.index);

		headStyle = xb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
		headStyle.setAlignment(XSSFCellStyle.ALIGN_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((short) align);
		cellStyle.setVerticalAlignment((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(XSSFCellStyle.ALIGN_CENTER);
		cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_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");
		System.out.println("BOLD:" + XSSFFont.BOLDWEIGHT_BOLD);
		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.setBoldweight(boldWeight);
		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(valign);
		if (align != -1)
			cellStyle1.setAlignment(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;
	}

	/**
	 * eg: new HssfHelper().export(list, new String[][]{ {"用户号码", "MSISDN"},
	 * {"姓名", "NAME"}, {"投诉类型", "COMPLAIN_TYPE"}, {"工单流水号","TASKNO"},
	 * {"录音流水号","RECORDNO"}, {"投诉事由","COMPLAIN_CONTENT"}});
	 * 
	 * @param list
	 * @param map
	 * @return
	 */
	public XSSFWorkbook export(List list, String[][] map, String sheetName) {
		XssfHelper xssfHelper = new XssfHelper();
		XSSFSheet sheet = xb.createSheet(sheetName);
		XSSFRow row = sheet.createRow((short) 0);
		XSSFCell cell = null;
		for (int i = 0; i < map.length; i++) {
			cell = xssfHelper.createCell(xb, row, i);
			cell.setCellStyle(headStyle);
			cell.setCellValue(map[i][0]);
		}
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i + 1);
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				xssfHelper.createCell(xb, row, j).setCellValue(
						StringUtils.notEmpty(hash.get(map[j][1])));

			}
		}
		return xb;
	}

	public XSSFWorkbook export2(List list, String[][] map, String sheetName) {
		XssfHelper xssfHelper = new XssfHelper();
		XSSFSheet sheet = xb.createSheet(sheetName);
		XSSFRow row = sheet.createRow((short) 0);
		XSSFCell cell = null;
		for (int i = 0; i < map.length; i++) {
			cell = xssfHelper.createCell(xb, row, i);
			cell.setCellStyle(headStyle);
			cell.setCellValue(map[i][0]);
		}
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i + 1);
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				if (map[j][2].equals("double")) {
					if (!StringUtils.notEmpty(hash.get(map[j][1])).equals("")) {
						xssfHelper.createCell(xb, row, j).setCellValue(
								Double.valueOf(StringUtils
										.notEmpty(hash.get(map[j][1]))));
					}
				} else {
					xssfHelper.createCell(xb, row, j).setCellValue(
							StringUtils.notEmpty(hash.get(map[j][1])));
				}
			}
		}
		return xb;
	}

	public XSSFWorkbook exportNumber(List list, String[][] map, String sheetName) {
		XssfHelper xssfHelper = new XssfHelper();
		XSSFSheet sheet = xb.createSheet(sheetName);
		XSSFRow row = sheet.createRow((short) 0);
		XSSFCell cell = null;
		for (int i = 0; i < map.length; i++) {
			cell = xssfHelper.createCell(xb, row, i);
			cell.setCellStyle(headStyle);
			cell.setCellValue(map[i][0]);
		}
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i + 1);
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				try {
					xssfHelper.createCell(xb, row, j).setCellValue(
							Float.valueOf(StringUtils.notEmpty(hash.get(map[j][1]))));
				} catch (Exception e) {
					xssfHelper.createCell(xb, row, j).setCellValue(
							StringUtils.notEmpty(hash.get(map[j][1])));
				}
			}
		}
		return xb;
	}

	public XSSFWorkbook exportByPageSize(List list, String[][] map, int pageSize) {
		if (pageSize <= 0)
			pageSize = 65530;
		XssfHelper xssfHelper = new XssfHelper();
		XSSFSheet sheet = null;
		XSSFRow row = null;
		XSSFCell cell = null;

		int currPage = 0;
		int pages = list.size() / pageSize + 1;
		for (int i = 0; i < list.size(); i++) {
			if (i % pageSize == 0) {
				int currPageSize = currPage == pages - 1 ? pageSize * currPage
						+ list.size() % pageSize : pageSize * (currPage + 1);
				String sheetName = (pageSize * currPage + 1) + "~"
						+ currPageSize;
				sheet = xb.createSheet(sheetName);
				row = sheet.createRow((short) 0);
				for (int j = 0; j < map.length; j++) {
					cell = xssfHelper.createCell(xb, row, j);
					cell.setCellStyle(headStyle);
					cell.setCellValue(map[j][0]);
				}
				currPage++;
			}
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				row = sheet.createRow((short) (i % pageSize) + 1);
				xssfHelper.createCell(xb, row, j).setCellValue(
						StringUtils.notEmpty(hash.get(map[j][1])));
			}
		}
		return xb;
	}


	public String getCellStringValue(XSSFCell cell) {
		DecimalFormat df = new DecimalFormat();
		if (cell == null)
			return "";
		switch (cell.getCellType()) {
		case XSSFCell.CELL_TYPE_STRING:
			return cell.getStringCellValue().trim();
		case XSSFCell.CELL_TYPE_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 XSSFWorkbook export(List list, String sheet_name) {
		XssfHelper xssfHelper = new XssfHelper();
		XSSFSheet sheet = xb.createSheet(sheet_name);
		XSSFRow row;
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i);
			Map map = (Map) list.get(i);
			Object[] values = map.values().toArray();
			for (int j = 0; j < values.length; j++) {
				xssfHelper.createCell(xb, row, j).setCellValue(
						StringUtils.notEmpty(values[j]));
			}
		}
		return xb;
	}

	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));

		}
	}
	/**
	 * 通过给定的模板导出
	 * @param dataList 
	 * @param filename 文件名 
	 * @param dir_get 获取模板的路径 
	 * @param dir_to 保存文件的路径
	 * @throws Exception
	 */
	public void exportBytemplet(List dataList,String filename,String dir_get,String dir_to) throws Exception {
		Map beans = new HashMap();
		beans.put("dataList", dataList);
		XLSTransformer transformer = new XLSTransformer();
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(dir_get));
			Workbook workbook = transformer.transformXLS(is, beans);
			FileOutputStream out=new FileOutputStream(dir_to+filename);
			workbook.write(out);
			is.close();
			out.flush();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public XSSFCell createHeadCell(XSSFWorkbook xb, XSSFRow row, int column) {
		XSSFFont headFont = xb.createFont();
		headFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
		headFont.setColor(HSSFColor.BLACK.index);
		XSSFCellStyle headStyle = xb.createCellStyle();
		headStyle.setFont(headFont);
		headStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
		headStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
		XSSFCell cell = row.createCell((short) column);
		//cell.setEncoding((short) 1); // 支持中文导出
		cell.setCellStyle(headStyle);
		return cell;
	}
	
	public void export3(XSSFWorkbook xb, List list, String[][] map, int headRows, int headCols, int sheetIndex) {
		XssfHelper xssfHelper = new XssfHelper(); 
		XSSFSheet sheet = xb.getSheetAt(sheetIndex);
		XSSFRow row = null; 
		XSSFCell cell = null;
		XSSFCellStyle cellStyle = xb.createCellStyle();
		cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((short) i + headRows);
			Map hash = (Map) list.get(i);
			for (int j = 0; j < map.length; j++) {
				cell = xssfHelper.createCell(xb, row, j + headCols); 
				String val = StringUtils.notEmpty(hash.get(map[j][0]));
				if(map[j][1].equals("double")){
					if(!val.equals("")){
						cell.setCellValue(Double.valueOf(val));
					}				
				} else if(map[j][1].equals("date")) {//传入完整日期date类型字段,去除最后的.0后缀
					if(!val.equals("")){
						val = val.substring(0, val.length()-2);
						cell.setCellValue(val);
					}	
				} else{
					cell.setCellValue(val);
				}
				cell.setCellStyle(cellStyle);
			}
		}
	}
}

接受的表格式

最后存入表的实体类

java 复制代码
package com.njry.modules.system.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
import cn.hutool.core.bean.copier.CopyOptions;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
* @description /
* @author wj
* @date 2024-05-09
**/
@Data
@TableName("SYS_TEST")
public class SysTest implements Serializable {

    @TableId(value="excelid", type = IdType.INPUT)
    @ApiModelProperty(value = "ID", hidden = true)
    private Long id;

    @ApiModelProperty(value = "excelid")
    private Long excelid;

    @ApiModelProperty(value = "parentlevel")
    private String parentlevel;

    @NotNull
    @ApiModelProperty(value = "headid")
    private String headid;

    @NotNull
    @ApiModelProperty(value = "colspan")
    private Integer colspan;

    @NotNull
    @ApiModelProperty(value = "rowspan")
    private Integer rowspan;

    @ApiModelProperty(value = "width")
    private Float width;

    @NotNull
    @ApiModelProperty(value = "rowfrom")
    private Integer rowfrom;

    @NotNull
    @ApiModelProperty(value = "rowto")
    private Integer rowto;

    @NotNull
    @ApiModelProperty(value = "colfrom")
    private Integer colfrom;

    @NotNull
    @ApiModelProperty(value = "colto")
    private Integer colto;

    @NotBlank
    @ApiModelProperty(value = "title")
    private String title;

    @ApiModelProperty(value = "子元素")
    @TableField(exist = false)
    private List<SysTest> children;

    public void copy(SysTest source){
        BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
    }

}

全局精华都在control里面(下面service,impl,mapper都不粘贴了)

java 复制代码
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.Font;
//import org.apache.poi.ss.util.CellRangeAddress;
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 shade.org.apache.poi.hssf.usermodel.HSSFCell;
import shade.org.apache.poi.hssf.usermodel.HSSFRow;
import shade.org.apache.poi.hssf.usermodel.HSSFSheet;
import shade.org.apache.poi.hssf.usermodel.HSSFWorkbook;
import shade.org.apache.poi.ss.usermodel.CellStyle;
import shade.org.apache.poi.ss.usermodel.Font;
import shade.org.apache.poi.ss.util.CellRangeAddress;

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();
//            获取每一行有多少列 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);
                headerCell.setBgcolor(colorHelper.getHex(headStyle.getFillForegroundColor()));
                headerCell.setFontColor(colorHelper.getHex(headFont.getColor()));
                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;
    }
}

导入的模本类似如下图

效果

相关推荐
忆~遂愿几秒前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
MZ_ZXD0015 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东7 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology12 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble17 分钟前
springboot的核心实现机制原理
java·spring boot·后端
人道领域25 分钟前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
大模型玩家七七1 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
CodeToGym1 小时前
【Java 办公自动化】Apache POI 入门:手把手教你实现 Excel 导入与导出
java·apache·excel
凡人叶枫1 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
JMchen1232 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio