導出excel工具類和依賴

依賴

      <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi</artifactId>
          <version>4.0.1</version>
      </dependency>

      <!--支持07年之前的-->
      <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi-ooxml</artifactId>
          <version>4.0.1</version>
      </dependency>

工具類

package com.xy.xuld.utils;

import com.xy.xuld.modules.vo.ExcelData;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Created by Dell on 2019/5/10.
 */
public class ExcelUtils {

    private static Logger logger= LoggerFactory.getLogger(ExcelUtils.class);

    public static void exportExcel(ExcelData data, HttpServletResponse response) throws Exception {
        XSSFWorkbook wb = new XSSFWorkbook();
        try {
            String sheetName = data.getName();
            if (null == sheetName) {
                sheetName = "Sheet1";
            }
            XSSFSheet sheet = wb.createSheet(sheetName);
            writeExcel(wb, sheet, data);
            String fileName=data.getName()+"("+DateUtil.convertDate2String("yyyyMMddHHmmssSSS",new Date())+")"+".xlsx";
            fileName = URLEncoder.encode(fileName, "utf-8");
            // 告訴瀏覽器用什麼軟件可以打開此文件 
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-disposition","attachment;filename="+fileName+"");
            response.flushBuffer();
            wb.write(response.getOutputStream());
        } catch(Exception e){
            e.printStackTrace();
        }finally{
            //此處需要關閉 wb 變量
            wb.close();
        }
    }

    private static void writeExcel(XSSFWorkbook wb, Sheet sheet, ExcelData data) {

        int rowIndex = 0;

        rowIndex = writeTitlesToExcel(wb, sheet, data.getTitles());
        try {
            writeRowsToExcel(wb, sheet, data.getRows(), rowIndex,data.getTitles());
        } catch (IOException e) {
            e.printStackTrace();
        }
        autoSizeColumns(sheet, data.getTitles().size() + 1);

    }

    //標題
    private static int writeTitlesToExcel(XSSFWorkbook wb, Sheet sheet,List<String> titles) {
        //行
        int rowIndex = 0;
        //列
        int colIndex = 0;
        Font titleFont = wb.createFont();
        titleFont.setFontName("微軟雅黑");
        //titleFont.setBoldweight(Short.MAX_VALUE);
        // titleFont.setFontHeightInPoints((short) 14);
        titleFont.setColor(IndexedColors.BLACK.index);

        XSSFCellStyle titleStyle = wb.createCellStyle();
        titleStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        titleStyle.setBorderBottom(BorderStyle.THIN); //下邊框
        titleStyle.setRightBorderColor(IndexedColors.GOLD.getIndex());//邊框顏色
        titleStyle.setBorderLeft(BorderStyle.THIN);//左邊框
        titleStyle.setBorderTop(BorderStyle.THIN);//上邊框
        titleStyle.setBorderRight(BorderStyle.THIN);//右邊框
        //THIN 正常 THICK 加粗 DOUBLE兩條 DASH_DOT虛線
        /*titleStyle.setFillForegroundColor(new XSSFColor(new Color(182, 184, 192)));
        titleStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);*/
        titleStyle.setFont(titleFont);
        titleStyle.setWrapText(true);//設置自動換行
//        titleStyle.setFillForegroundColor(IndexedColors.RED.index);
//        setBorder(titleStyle, BorderStyle.THIN, new XSSFColor(new Color(0, 0, 0)));




        Row titleRow = sheet.createRow(rowIndex);

        //====添加一個標題======
        //設置標題樣式
        XSSFCellStyle titleStyle2 = wb.createCellStyle();
        titleStyle2.setAlignment(HorizontalAlignment.CENTER);//水平居中
        titleStyle2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        Font titleFont2 = wb.createFont();
        titleFont2.setFontName("微軟雅黑");
        //titleFont.setBoldweight(Short.MAX_VALUE);
        titleFont2.setFontHeightInPoints((short) 18);
        titleFont2.setColor(IndexedColors.BLACK.index);
        titleStyle2.setFont(titleFont2);


        Cell cell2 = titleRow.createCell(0);
        cell2.setCellValue(sheet.getSheetName());
        cell2.setCellStyle(titleStyle2);
        //合併單元格參數分別代表 起始行,截至行,起始列, 截至列
        sheet.addMergedRegion(new CellRangeAddress(rowIndex, ++rowIndex, 0,titles.size()-1));
        rowIndex++;
        //======結束=======

        //====添加一個二級標題======
        //設置樣式
        XSSFCellStyle titleStyle3 = wb.createCellStyle();
        titleStyle3.setAlignment(HorizontalAlignment.LEFT);//水平居中
        titleStyle3.setFont(titleFont);
        titleRow = sheet.createRow(rowIndex);
        Cell cell3 = titleRow.createCell(0);
        cell3.setCellValue("創建時間:"+new SimpleDateFormat("yyyy.MM.dd").format(new Date()));
        cell3.setCellStyle(titleStyle3);
        if(titles.size()==1){
            sheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0,1));
        }else {

            sheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0,titles.size()-1));
        }
        rowIndex++;
        //======結束=======

        //重新定位所在行
        titleRow = sheet.createRow(rowIndex);
        // titleRow.setHeightInPoints(25);
        colIndex = 0;
//        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0,titles.size()-1));
        for (String field : titles) {
            Cell cell = titleRow.createCell(colIndex);
            cell.setCellValue(field);
            cell.setCellStyle(titleStyle);
            colIndex++;
        }

        rowIndex++;
        return rowIndex;
    }

    //內容
    private static int writeRowsToExcel(XSSFWorkbook wb, Sheet sheet, List<List<Object>> rows, int rowIndex,List<String> titles) throws IOException {
        int colIndex = 0;
        Font dataFont = wb.createFont();
        dataFont.setFontName("微軟雅黑");
        // dataFont.setFontHeightInPoints((short) 14);
        dataFont.setColor(IndexedColors.BLACK.index);
        int flag=0;
        for (int i = 0; i < titles.size(); i++) {
            if(titles.get(i).contains("圖片")){
                flag=i;
                break;
            }
        }

        XSSFCellStyle dataStyle = wb.createCellStyle();
        dataStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
        dataStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        dataStyle.setFont(dataFont);
        int i=0;
        for (List<Object> rowData : rows) {
            Row dataRow = sheet.createRow(rowIndex);
            dataRow.setHeightInPoints(50);
            colIndex = 0;

            for (Object cellData : rowData) {
                Cell cell = dataRow.createCell(colIndex);
                if (cellData != null) {
                   if(colIndex==flag&&cellData.toString().contains("http://")){
                       cell.setCellValue("");
                        try {
                            Drawing drawing = sheet.createDrawingPatriarch();
                            CreationHelper helper = wb.getCreationHelper();
                            URL url = new URL(cellData.toString());
                            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                            boolean notfind =false;
                            try {
                                urlConnection.setConnectTimeout(300);
                                urlConnection.setReadTimeout(1000);
                            if(urlConnection.getResponseCode()>=400){
                                notfind =true;
                            }}catch (Exception e) {
                                notfind =true;
                            }
                            if (!notfind) {
                                InputStream is = new BufferedInputStream(url.openStream());
                                byte[] bytes = IOUtils.toByteArray(is);
                                int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
                                is.close();
                                ClientAnchor anchor = helper.createClientAnchor();
                                anchor.setDx1(0);
                                anchor.setDy1(0);
                                anchor.setDx2(0);
                                anchor.setDy2(0);
                                anchor.setCol1(flag);
                                anchor.setRow1(4+i);
                                anchor.setCol2(flag+1);
                                anchor.setRow2(5+i);
                                Picture pict = drawing.createPicture(anchor, pictureIdx);
                            }

                        } catch (IOException e) {
                            e.printStackTrace();
                            logger.error("圖片未找到");
                        }

                    }
                    else {
                        cell.setCellValue(cellData.toString());
                    }



                } else {
                    cell.setCellValue("");
                }

                cell.setCellStyle(dataStyle);
                colIndex++;
            }
            i++;
            rowIndex++;
        }
        return rowIndex;
    }

    private static void autoSizeColumns(Sheet sheet, int columnNumber) {

        for (int i = 0; i < columnNumber; i++) {
            int orgWidth = sheet.getColumnWidth(i);
            sheet.autoSizeColumn(i, true);
            int newWidth = (int) (sheet.getColumnWidth(i) + 100);
            if(newWidth<255*256){
                sheet.setColumnWidth(i, newWidth < 3000 ? 3000 : newWidth);
            }else{
                sheet.setColumnWidth(i,6000 );
            }
            /*if (newWidth > orgWidth) {
                sheet.setColumnWidth(i, newWidth);
            } else {
                sheet.setColumnWidth(i, orgWidth);
            }*/
        }
    }

    private static void setBorder(XSSFCellStyle style, BorderStyle border, XSSFColor color) {
        style.setBorderTop(border);
        style.setBorderLeft(border);
        style.setBorderRight(border);
        style.setBorderBottom(border);
        style.setBorderColor(XSSFCellBorder.BorderSide.TOP, color);
        style.setBorderColor(XSSFCellBorder.BorderSide.LEFT, color);
        style.setBorderColor(XSSFCellBorder.BorderSide.RIGHT, color);
        style.setBorderColor(XSSFCellBorder.BorderSide.BOTTOM, color);
    }
    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章