excel单个对象用poi导出,并设置每个sheet得最大行数防止报错

**
说明:
07版本excel最大为10万行数、
comExcelList得对象使用注解做的@ExcelSheet(name = “组件”)

**

String name="sheet";
ExportUtil.exportToWeb(request, response, fileName, comExcelList,name);
package com.zfm.util;
import com.zfm.config.ExcelField;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author fmzhang2
 * @date 2022/2/23
 **/
public class ExportUtils {

	public static int maxRowNums=80000;//sheet最大行数


	/**
	 * fileName:  导出的的excel名称
	 * sheetDataListArr:	excelSheet对象list
	 * name :shell页名称
	 * @author fmzhang2
	 * @date 2022/2/23
	 **/
	public static <T> void exportToWeb(HttpServletRequest request, HttpServletResponse response, String fileName,
									   List<T> sheetDataListArr, String name) throws Exception {

		XSSFWorkbook wb= ExportUtils.getXSSFWorkbook(sheetDataListArr,name);
		response.reset();
		response.setContentType("application/vnd.ms-excel;charset=GBK");
		if (!fileName.endsWith(".xlsx")) {
			fileName = fileName + ".xlsx";
		}

		String userAgent = request.getHeader("user-agent").toLowerCase();
		if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
			// win10 ie edge 浏览器 和其他系统的ie
			fileName = URLEncoder.encode(fileName, "UTF-8");
		} else {
			// 其他
			fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
		}
		response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
		OutputStream os=response.getOutputStream();
		wb.write(os);
		os.flush();
		os.close();
	}

	    /**
     * 根据list解析注解生成HSSFWorkbook
     * @param list 导出的集合
     * @return
     * @throws Exception
     */
    public static <T> SXSSFWorkbook getXSSFWorkbook(List<T> list, String name) throws Exception {
        if (list == null) {
            return null;
        }

        SXSSFWorkbook wb = new SXSSFWorkbook();
        int sheetNum = (list.size() - 1) / maxRowNums + 1;//sheet数
        SXSSFSheet[] sheets = new SXSSFSheet[sheetNum];

        T t = list.get(0);
        Class clazz = t.getClass();
        List<String> titles = new ArrayList<String>();
        Field[] fields = clazz.getDeclaredFields();
        ArrayList<Field> effectFields = new ArrayList<Field>();
        for (Field field : fields) {
            ExcelField a = field.getAnnotation(ExcelField.class);
            if (a != null) {
                titles.add(a.name());//标题
                effectFields.add(field);//要导出的属性
            }
        }
        //CellStyle rowTopStyle = getRowTopStyle(wb);
        CellStyle style = getRowTopStyle(wb);
        for (int i = 0; i < sheets.length; i++) {
            // 创建Excel的工作sheet,对应到一个excel文档的tab
            //sheets[i] = wb.createSheet(name+(i+1));
            if (sheetNum > 1) {
                sheets[i] = wb.createSheet(name + (i + 1));
            } else {
                sheets[i] = wb.createSheet(name);
            }
            SXSSFRow rowTitle = sheets[i].createRow(0);
            //TODO 冻结第一行表头
            sheets[i].createFreezePane(0, 1, 0, 1);
            // 自动调整列宽
            sheets[i].trackAllColumnsForAutoSizing();
            for (int j = 0; j < titles.size(); j++) {//遍历title,为excel首行设置标题
                SXSSFCell cell = rowTitle.createCell(j);
                cell.setCellStyle(style);
                cell.setCellValue(titles.get(j));
                sheets[i].autoSizeColumn(j);
                //单元格列宽设置
                int colWidth = sheets[i].getColumnWidth(j) * 2;
                if (colWidth < 255 * 256) {
                    sheets[i].setColumnWidth(j, Math.max(colWidth, 3000));
                } else {
                    sheets[i].setColumnWidth(j, 5000);
                }
            }
        }
        if (list.size() > 0) {
            for (int k = 0; k < list.size(); k++) {
                T l = list.get(k);
                int index = k / maxRowNums;
                SXSSFRow row = sheets[index].createRow(k % maxRowNums + 1);
                for (int i = 0; i < effectFields.size(); i++) {
                    Field field = effectFields.get(i);
                    ExcelField a = field.getAnnotation(ExcelField.class);
                    boolean url = a.url();
                    if (url) {
                        //TODO 为链接地址
                        field.setAccessible(true);
                        Object fieldValue = field.get(l);
                        String fieldValueString = FieldReflectionUtil.formatValue(field, fieldValue);
                        SXSSFCell cell = row.createCell(i);
                        link(wb, fieldValueString, cell);
                    } else {
                        setValueToCell(field, l, row, i);
                    }
                }
            }
        }
        return wb;
    }

    /**
     * 链接字体变蓝可以点击跳转
     * @param wb
     * @param value
     * @param cellX
     * @author fmzhang2
     * @date 2022/7/28
     **/
    public static void link(SXSSFWorkbook wb, String value, SXSSFCell cellX) {
        CreationHelper createHelper = wb.getCreationHelper();
        Hyperlink hyperlink = createHelper.createHyperlink(HyperlinkType.FILE);
        hyperlink.setAddress(value);
        cellX.setHyperlink(hyperlink);
        CellStyle style1 = wb.createCellStyle();
        //声明一个字体对象
        Font font = null;
        //创建一个字体对象
        font = wb.createFont();
        //给字体对象设置颜色属性
        font.setColor((short) 30);
        //将字体对象放入XSSFCellStyle对象中
        style1.setFont(font);
        cellX.setCellStyle(style1);
        cellX.setCellValue(value);
    }


    /**
     * @description 标题列的单元格样式
     */
    public static CellStyle getRowTopStyle(SXSSFWorkbook workbook) {
        //设置样式;
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        // 顶边栏
        style.setBorderTop(BorderStyle.THIN);
        style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
        // 右边栏
        style.setBorderRight(BorderStyle.THIN);
        style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
        // 底边栏
        style.setBorderBottom(BorderStyle.THIN);
        style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
        // 左边栏
        style.setBorderLeft(BorderStyle.THIN);
        style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
        style.setAlignment(HorizontalAlignment.CENTER);
        // 设置填充方案
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        // 背景色
        style.setFillForegroundColor(IndexedColors.PALE_BLUE.index);
        return style;
    }
	
	/**
	 * 填充内容到单元格
	 * @param field 属性
	 * @param l 实体
	 * @param row 行
	 * @param cellIndex 列下标
	 * @throws Exception
	 */
	private static <T> void setValueToCell(Field field, T l, XSSFRow row, int cellIndex) throws Exception
	{
		Class clazz=l.getClass();
		ExcelField a=field.getAnnotation(ExcelField.class);
		if(a==null)//如果没有RowTitle注解,跳过该字段
		{
			return;
		}
		Type fieldType=field.getGenericType();
		String fieldName=field.getName();
		fieldName=fieldName.substring(0, 1).toUpperCase()+fieldName.replaceFirst("\\w","");//将首字母转换为大写
		Method method=clazz.getMethod("get"+fieldName);
		if(fieldType.toString().equals("class java.lang.Integer")|| fieldType.toString().equals("int"))
		{
			Integer value=(Integer)method.invoke(l);
			if(value!=null)
			{
				row.createCell(cellIndex).setCellValue(value);
			}
		}else if(fieldType.toString().equals("class java.lang.String"))
		{
			String value=(String)method.invoke(l);
			if(value!=null)
			{
				row.createCell(cellIndex).setCellValue(value);
			}
		}else if(fieldType.toString().equals("class java.lang.Long")||fieldType.toString().equals("long"))
		{
			Long value=(Long)method.invoke(l);
			if(value!=null)
			{
				row.createCell(cellIndex).setCellValue(value);
			}
		}else if(fieldType.toString().equals("class java.lang.Float")||fieldType.toString().equals("float"))
		{
			Float value=(Float)method.invoke(l);
			if(value!=null)
			{
				row.createCell(cellIndex).setCellValue(value);
			}
		}else if(fieldType.toString().equals("class java.lang.Double")||fieldType.toString().equals("double"))
		{
			Double value=(Double)method.invoke(l);
			if(value==null)
			{
				return;
			}
			if(!"".equals(a.dateformat()))
			{
				 DecimalFormat df = new DecimalFormat(a.dateformat());
				 row.createCell(cellIndex).setCellValue(df.format(value));
			}else{
				row.createCell(cellIndex).setCellValue(value);
			}
		}else if(fieldType.toString().equals("class java.util.Date")||
				fieldType.toString().equals("class java.sql.Timestamp"))
		{	if("".equals(a.dateformat()))
			{
				Date value=(Date)method.invoke(l);
				if(value!=null)
				{
					row.createCell(cellIndex).setCellValue(value);
				}
			}else
			{
				String format=a.dateformat();
				SimpleDateFormat sdf=new SimpleDateFormat(format);
				Date value=(Date)method.invoke(l);
				if(value!=null)
				{
					row.createCell(cellIndex).setCellValue(sdf.format(value));
				}
			}
		}
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用poi导出excel的案例,其中包含三个sheet每个sheet数据来自不同的对象集合。 ```java import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.poi.ss.usermodel.Cell; 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.xssf.usermodel.XSSFWorkbook; public class ExcelExportExample { public static void main(String[] args) throws IOException { // 创建一个Workbook Workbook workbook = new XSSFWorkbook(); // 创建第一个Sheet,名为"Sheet1" Sheet sheet1 = workbook.createSheet("Sheet1"); // 创建第二个Sheet,名为"Sheet2" Sheet sheet2 = workbook.createSheet("Sheet2"); // 创建第三个Sheet,名为"Sheet3" Sheet sheet3 = workbook.createSheet("Sheet3"); // 准备Sheet1的数据 List<Sheet1Data> sheet1DataList = new ArrayList<>(); sheet1DataList.add(new Sheet1Data("张三", 20, "男")); sheet1DataList.add(new Sheet1Data("李四", 25, "女")); sheet1DataList.add(new Sheet1Data("王五", 30, "男")); // 写入Sheet1的数据 int rowIndex = 0; for (Sheet1Data data : sheet1DataList) { Row row = sheet1.createRow(rowIndex++); Cell cell0 = row.createCell(0); cell0.setCellValue(data.getName()); Cell cell1 = row.createCell(1); cell1.setCellValue(data.getAge()); Cell cell2 = row.createCell(2); cell2.setCellValue(data.getGender()); } // 准备Sheet2的数据 List<Sheet2Data> sheet2DataList = new ArrayList<>(); sheet2DataList.add(new Sheet2Data("A", 80)); sheet2DataList.add(new Sheet2Data("B", 75)); sheet2DataList.add(new Sheet2Data("C", 90)); // 写入Sheet2的数据 rowIndex = 0; for (Sheet2Data data : sheet2DataList) { Row row = sheet2.createRow(rowIndex++); Cell cell0 = row.createCell(0); cell0.setCellValue(data.getName()); Cell cell1 = row.createCell(1); cell1.setCellValue(data.getScore()); } // 准备Sheet3的数据 List<Sheet3Data> sheet3DataList = new ArrayList<>(); sheet3DataList.add(new Sheet3Data(1, "A", "2021-01-01")); sheet3DataList.add(new Sheet3Data(2, "B", "2021-01-02")); sheet3DataList.add(new Sheet3Data(3, "C", "2021-01-03")); // 写入Sheet3的数据 rowIndex = 0; for (Sheet3Data data : sheet3DataList) { Row row = sheet3.createRow(rowIndex++); Cell cell0 = row.createCell(0); cell0.setCellValue(data.getId()); Cell cell1 = row.createCell(1); cell1.setCellValue(data.getName()); Cell cell2 = row.createCell(2); cell2.setCellValue(data.getDate()); } // 将Workbook写入文件 FileOutputStream outputStream = new FileOutputStream("example.xlsx"); workbook.write(outputStream); outputStream.close(); System.out.println("Excel文件已成功导出。"); } // Sheet1的数据对象 static class Sheet1Data { private String name; private int age; private String gender; public Sheet1Data(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public int getAge() { return age; } public String getGender() { return gender; } } // Sheet2的数据对象 static class Sheet2Data { private String name; private int score; public Sheet2Data(String name, int score) { this.name = name; this.score = score; } public String getName() { return name; } public int getScore() { return score; } } // Sheet3的数据对象 static class Sheet3Data { private int id; private String name; private String date; public Sheet3Data(int id, String name, String date) { this.id = id; this.name = name; this.date = date; } public int getId() { return id; } public String getName() { return name; } public String getDate() { return date; } } } ``` 这个例子中,我们创建了一个Workbook,并创建了三个Sheet,分别为"Sheet1"、"Sheet2"、"Sheet3"。我们准备了三个不同的对象集合,分别为Sheet1Data、Sheet2Data、Sheet3Data,并将它们写入到Workbook的相应Sheet中。最后,将Workbook写入到文件中。 在这个例子中,我们使用了XSSFWorkbook类来创建Workbook,并使用了createSheet()方法来创建Sheet。我们通过创建Row对象和Cell对象来写入数据,然后通过FileOutputStream将Workbook写入到文件中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值