poi导出excel,支持合并的单元格


poi导出excel

支持合并的单元格



/**
 * 
 */
package ctsi.pf.business.exportToExcel;


import com.eos.system.annotation.Bizlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.util.Region;


import com.eos.data.xpath.XPathLocator;
import com.eos.foundation.common.io.FileUtil;
import com.eos.foundation.eoscommon.ConfigurationUtil;
import com.eos.runtime.core.ApplicationContext;
import com.eos.system.annotation.Bizlet;
import com.eos.system.annotation.BizletParam;
import com.eos.system.annotation.ParamType;

import commonj.sdo.DataObject;
/**
 * @author majie
 * @date 2012-11-13 13:44:55
 *
 */
@Bizlet("")
public class OrderExportToExcel {

	/**
	 * @param args
	 * @author majie
	 * @throws IOException 
	 */
	private static HSSFCellStyle cellStyleTXT;
	private static HSSFCellStyle cellStyleData;
	private static DataObject[] exportObjects;
	private static HSSFSheet sheetFirst;
	private static HSSFSheet sheetSecond;
	@Bizlet("测试")
	public static void exportToExcel(DataObject[] exportObjectsIn) throws IOException{
		exportObjects=exportObjectsIn;
		
		//文件名
		String filename="test1";
		if(filename.indexOf(".xls")==-1){
			filename+=".xls";
		}
		
		//输出目录
		String tempDir="c:/"+"temp/";
		File file=new File(tempDir);
		if(!file.exists()){
			//创建临时目录
			FileUtil.mkDir(tempDir);
			//file.createNewFile();
		}
		//生成完整文件名+路径
		
		String outputFile=tempDir+generateOutputExcelFile(filename);
        // 声明一个工作薄  
        HSSFWorkbook workbook = new HSSFWorkbook();  
        // 生成两个sheet 
        HSSFSheet sheet1 = workbook.createSheet("订单基本信息");  
        HSSFSheet sheet2 = workbook.createSheet("订单内容信息"); 
        sheetFirst=sheet1;
        sheetSecond=sheet2;
        sheet1.setColumnWidth((short)0,(short)4000);
        sheet1.setColumnWidth((short)1,(short)8000);
        sheet1.setColumnWidth((short)2,(short)4000);
        sheet1.setColumnWidth((short)3,(short)8000);
        
		//生成sheet1左边文字样式
		HSSFCellStyle StyleTXT=workbook.createCellStyle();
		StyleTXT.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
		StyleTXT.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);
		StyleTXT.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
		StyleTXT.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
		StyleTXT.setBorderRight(HSSFCellStyle.BORDER_THIN);  
		StyleTXT.setBorderTop(HSSFCellStyle.BORDER_THIN);        
		cellStyleTXT=StyleTXT;
		
		//生成sheet1数据样式
		HSSFCellStyle StyleData=workbook.createCellStyle();
		StyleData.setAlignment(HSSFCellStyle.ALIGN_LEFT);
		StyleData.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);
		StyleData.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
		StyleData.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
		StyleData.setBorderRight(HSSFCellStyle.BORDER_THIN);  
		StyleData.setBorderTop(HSSFCellStyle.BORDER_THIN);
		cellStyleData=StyleData;
//		System.out.println("233");
        int startRow=0;
        
        
        //设置行数列数
        int column=4,row=13;

        String[][] datasImportFormat={
        		{"定单流水号:","#_formCode","单据类型:","#_orderProcessType"},
        		{"合同编号:","#_contractCode","单据类型:","#_acceptType"},
        		{"受理运营商:","#_acceptCompany","受理部门:","#_businessCreateAreaName"},
        		{"受理类型:","#_busiAcceptType","申请时间:","#_applyDate2"},
        		{"申请人:","#_applyPerson2","发起地客户经理:","#_initiateCustomerManager"},
        		{"发起地业务经理:","#_initiateBusinessManager","集团国际业务支撑经理:","#_groupInterBusinessManager"},
        		{"海外公司业务经理:","#_abroadBusinessManager","集团业务经理:","#_groupBusinessManager"},
        		{"付费方式:","#_orderFeetype","付费客户:","#_payCustomerNo"},
        		{"付费客户名称:","#_payCustomerName","客户名称:","#_consumerName"},
        		{"客户编号:","#_consumerId","客户联系人:","#_consumerPerson"},
        		{"联系电话:","#_consumerTel","客户地址:","#_consumerAddr"},
        		{"Email:","#_consumerEmail","账户名称:","#_null"},
        		{"备注","$_MR3$#_orderNote"}
        	};
        //格式说明:  $_MR3$ 合并3个单元格(合并多少个就写多少个数字)
        //			#_加实体的字段名
        //			如果为字串则直接写入
        //计算总元素数
        int count=0;
        for(int i=0;i<row;i++)
        	count+=datasImportFormat[i].length;
        
//        System.out.println(datasImportFormat.length+"");
        for(int i=0;i<row;i++){
            HSSFRow rowData=sheet1.createRow(startRow++);
            rowData.setHeight((short) 800);            
        	for(int j=0;j<column;j++){
        		//写入单元格
        		if((count--)>0)
        			creatCell(rowData,j,datasImportFormat[i][j],sheet1);
        	}
        	
        }
               
        //生成excel文件
        FileOutputStream fileOut = new FileOutputStream(outputFile);
        workbook.write(fileOut);
        fileOut.close();
        
	}
	
	
	/**
	 * 生成单元格,套用格式
	 * @param HSSFRow row,int cellIndex,String strIn,HSSFSheet sheet
	 * @return
	 */
	private static void creatCell(HSSFRow row,int cellIndex,String strIn,HSSFSheet sheet){
		HSSFCell cell=row.createCell((short)cellIndex); 
		Object str;
		int MergedRegionNum=0;//合并单元格的数量
		
		//处理合并的单元格
		if(strIn.startsWith("$_MR")){
			int nextStart=strIn.indexOf("$", 3);	
			MergedRegionNum=Integer.parseInt(strIn.substring(4,nextStart));
			strIn=strIn.substring(nextStart+1);
			sheet.addMergedRegion(new Region(row.getRowNum(),(short)cellIndex,row.getRowNum(),(short)(cellIndex+MergedRegionNum-1)));
		}
		
		//处理格式
		if(strIn.startsWith("#_")){
			str=XPathLocator.newInstance().getValue(exportObjects[0],strIn.substring(2));
			cell.setCellStyle(cellStyleData);
			if(MergedRegionNum>1){
				for(int i=1;i<MergedRegionNum;i++){
					row.createCell((short)(i+cellIndex));
					row.getCell((short)(i+cellIndex)).setCellStyle(cellStyleData);
				}
			}				
		}else{
			str=strIn;
			cell.setCellStyle(cellStyleTXT);

			if(MergedRegionNum>1){
				for(int i=1;i<MergedRegionNum;i++){
					row.createCell((short)(i+cellIndex));
					row.getCell((short)(i+cellIndex)).setCellStyle(cellStyleTXT);
				}
			}
		}
		
		//判断数据类型写入单元格类型
		if(str!=null){
			if(str instanceof Double|| str instanceof BigDecimal){
				cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
				cell.setCellValue(Double.parseDouble(str.toString()));
			}else{
				cell.setCellType(HSSFCell.CELL_TYPE_STRING);
				cell.setCellValue(new HSSFRichTextString(str.toString()));
			}
		}else{
			cell.setCellType(HSSFCell.CELL_TYPE_BLANK);
		}
	}
	
	/**
	 * 生成EXCEL输出文件,默认带时间戳
	 * @param templateFilename 文件名
	 * @return
	 */
	private static String generateOutputExcelFile(String templateFilename){
		String filename=templateFilename;
		if(templateFilename.endsWith(".xls")){
			filename=templateFilename.substring(0,templateFilename.length()-4);
		}

		SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
		String datetimeString=format.format(new Date());

		filename=filename+"_"+datetimeString+".xls";
		return filename;
	}
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache poi 导出excel合并单元格可以使用setRegionStyle方法来设置合并单元格的样式。这个方法接受三个参数,分别是Sheet对象、CellRangeAddress对象和CellStyle对象。在这个方法中,通过循环遍历合并单元格的每一行和每一列,然后获取对应的单元格并设置样式。具体的代码实现可以参考引用\[1\]中的示例代码。 此外,还可以使用PoiModel类来定义导出excel时的数据模型。这个类包含了内容、上一行同一位置内容、行标、列标等属性。可以根据实际需求来使用这个类。具体的代码实现可以参考引用\[2\]和引用\[3\]中的示例代码。 总结起来,Apache poi 导出excel合并单元格的步骤包括设置合并单元格的样式和定义导出数据的模型。可以根据具体的需求来使用相应的方法和类来实现导出功能。 #### 引用[.reference_title] - *1* *3* [poi 导出Excel 动态 合并单元格](https://blog.csdn.net/weixin_65436454/article/details/127806178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [使用POI 导出Excel 动态合并单元格](https://blog.csdn.net/weixin_41722928/article/details/112849624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值