JAVA后端导出之JXL封装(更新于20190629)

这个工具类是是我在维护我们的项目导出功能的时候发现后台代码太臃肿了,重复的很多,于是自己根据jxl.jar包自己封装了导出方法,简化了java中Excel导出的繁琐操作,希望能帮助到需要实现导出功能的人,如果有什么疑问或者不懂得的可以留言给我.

说明:

    这个工具类主要是针对将我们将数据库数据查询保存包实体类集合中,然后到处到Excel表中而实现的,目前实现导出的样式基本信息如下.

导出的样式就是这样,可以设置其实位置,是否需要编号列,指定显示列.

代码如下:

/**
 * @文件名称: <b>ExportUtil.java</b>
 * @类路径: <b>com.shangbo.util</b> 
 * @描述: <b>TODO</b>
 * @作者:<b>XieGang</b>  
 * @时间:<b>2018-6-9 下午10:10:57</b>  
 * @版本:<b>V1.5</b> 
 */
package com.sunboon.rbas.util.myutil;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.List;

import jxl.Cell;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.ScriptStyle;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/**
 * <b>#### 导出工具类 ####</b><br>
 * ● 所属公司 : Sunboon<br>
 * ● 作者 : Xg<br>
 * ● 描述 : 此工具类用来简化导出操作,需要依赖导出jar包 jxl.jar,点击下载 : 
 * <a href="https://pan.baidu.com/s/1oken2xSYKCq4e55dCFa24g">jxl.jar</a> 密码:cx49
 * 此工具类目前实现了一下方法:<br/>1 自动设置列宽 ;2 设置标题头 ;3 字体和样式设置;4 创建表格<br/>
 * ● 创建时间 : 2018-6-9 下午10:10:57<br>
 * ● 版本 : V1.0</font>    
 */
public class ExportUtils<T> {
	
	/**
	 * 根据实体类导出表格数据(<span style="color:red">注意参数columsName和参数fildGetStr的索引要一一对应,否则会出现数据错乱</span>)
	 * @param filePath 文件路径/文件名.xls(xlsx)
	 * @param colNames 表格列标题数组(当第一列列名为编号或者序号的时候,会自动创建每一行数据的序号
	 * @param list 存有实体类数据的集合
	 * @param fieldGetStr 需要的实体类的get方法(当该参数为null或空的时候,为默认获取该实体类的所有属性对应的get方法)
	 * 
	 * @方法说明 该方法封装了通过实体类的方式导出数据,使用示例:<pre>
	 * List<实体类> list = riskWarnDao.getAuthTellerFhList(params);
	 * String[] columsName = {"字段1","字段2","字段3","字段5","字段7"};
	 * String[] fildGetStr = {"字段1在实体类中的get方法名","字段2在实体类中的get方法名","字段3在实体类中的get方法名","字段5在实体类中的get方法名","字段7在实体类中的get方法名"};
	 *  //说明:get方法名不包含括号部分,如name 的get方法:
	 *  //private String name;
	 *  //public string getName(){....}
	 *  //get方法名为:getName
	 * String excelName = new ExportUtils<实体类>().createExcel("D:/"+fileName, columsName, list,fildGetStr);
	 * </pre>
	 * @最后更新 2019-06-28
	 * @作者 xiegang
	 * @return
	 */
	public String createExcel(String filePath, String[] colNames, List<T> list,String[] fieldGetStr) {
		//处理标题
		String title = filePath.substring(filePath.lastIndexOf(File.separator)+1);
		String sheetName = title.substring(0,title.lastIndexOf("."));
	
		if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx")){
			return "创建Excel文件:"+title+"失败,具体原因:文件名不是以\".xls\"或\".xlsx\"结尾";
		}
		
		WritableWorkbook workbook = null;
		WritableSheet sheet = null;
		//开始处理数据
		try {
			//创建工作簿对象
			workbook = Workbook.createWorkbook(new File(filePath));
			//创建一个sheet页面
			sheet = workbook.createSheet(sheetName, 0);
			
			//初始化列标题样式
			WritableCellFormat thFormat = getCellFormat("等线", 12,true);
			thFormat.setBackground(Colour.GREY_25_PERCENT);// 设置单元格的背景颜色
			thFormat.setAlignment(Alignment.CENTRE); // 设置对齐方式
			thFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框
			// 添加列标题
			int col = colNames[0].equals("编号") || colNames[0].equals("序号") ? 1 : 0;//开始列
			int row = 0;//开始行
			for(int i=0;i<colNames.length;i++){
				sheet.addCell(new Label(i, row, colNames[i],thFormat));
			}
			row = 1;
			
			//初始化正文样式
			WritableCellFormat tdFormat = getCellFormat("等线", 10);
			tdFormat.setAlignment(Alignment.CENTRE); // 设置对齐方式
			tdFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框
			//填充数据
			
			//初始化Get方法
			fieldGetStr = intiGetStr(list, fieldGetStr);
			
			//根据字段处理数据
			for(int i = 0;i< list.size();i++){//T代表一行数据
				Method method = null;
				String attr = null;
				T t = list.get(i);
				for(int j = 0;j< fieldGetStr.length;j++){//每循环一次,得到一个属性值
					method = t.getClass().getMethod(fieldGetStr[j],new Class[]{});
					attr = String.valueOf(method.invoke(t, new Object[]{}));
					sheet.addCell(new Label(j+col, i+row, attr, tdFormat));
				}
				if(col == 1){
					sheet.addCell(new Label(col-1, row+i, String.valueOf(i+1), thFormat));
				}
			}
			
			autoSetCell(0, colNames.length, sheet);//自动设置单元格宽度
			
			//插入标题行
			sheet.insertRow(0);
			
			tdFormat = getCellFormat("等线", 16);
			tdFormat.setAlignment(Alignment.CENTRE);
			tdFormat.setVerticalAlignment(VerticalAlignment.CENTRE);//垂直居中对齐
			sheet.addCell(new Label(0,0,title,tdFormat));
			sheet.mergeCells(0, 0, colNames.length-1, 0);//合并
			
			sheet.setRowView(0, 500, false);
			workbook.write();
			workbook.close();
		} catch (Exception e) {
			e.printStackTrace();
			return "创建Excel文件:"+title+"失败,具体原因:"+e.fillInStackTrace();
		}
		return title;
	}
	
	//初始化Get方法
	private String[] intiGetStr(List<T> list, String[] fieldGetStr) {
		if(fieldGetStr == null || fieldGetStr.length == 0){
			T t = list.get(0); //一个T代表一个实体对象
			Field[] fields = null;
			String field = null;
			//未自定义实体类属性,默认获取全部属性
			fields = t.getClass().getDeclaredFields();
			fieldGetStr = new String[fields.length];
			for(int j=0;j<fields.length;j++){
				//得到T对象的每一个字段
				field = fields[j].getName();
				//处理boolean类型字段
				if(fields[j].getType().toString().toLowerCase().contains("boolean")){
					if(field.startsWith("is") && field.length()>3){
						//情况1 字段以is开头, 如: isStatus
						if(Character.isUpperCase(field.charAt(2))){
							fieldGetStr[j] = field;
						}	
					}else{
						//情况2 字段以is开头,但都是小写 如isboy == isIsboy
						//情况3 字段不包含is 如:boy
						fieldGetStr[j] = "is"+field.substring(0,1).toUpperCase()+field.substring(1);
					}
				}else{
					fieldGetStr[j] = "get"+field.substring(0,1).toUpperCase()+field.substring(1);
				}
			}
		}
		return fieldGetStr;
	}
	
	
	
	/**
	 * 根据实体类导出表格数据<span style="color:red">注意参数columsName和参数fildGetStr的索引要一一对应,否则会出现数据错乱</span>
	 * @param sDate 开始日期(不需要的时候设置为null或者"")
	 * @param eDate 结束日期(只有开始日期存在得时候才生效
	 * @param filePath 文件路径/文件名.xls(xlsx)
	 * @param colNames 表格列标题数组(当第一列列名为编号或者序号的时候,会自动创建每一行数据的序号
	 * @param list 存有实体类数据的集合
	 * @param fieldGetStr 需要的实体类的get方法(当该参数为null或空的时候,为默认获取该实体类的所有属性对应的get方法)
	 * 
	 * @方法说明 该方法封装了通过实体类的方式导出数据,使用示例:<pre>
	 * List<实体类> list = riskWarnDao.getAuthTellerFhList(params);
	 * String[] columsName = {"字段1","字段2","字段3","字段5","字段7"};
	 * String[] fildGetStr = {"字段1在实体类中的get方法名","字段2在实体类中的get方法名","字段3在实体类中的get方法名","字段5在实体类中的get方法名","字段7在实体类中的get方法名"};
	 *  //说明:get方法名不包含括号部分,如name 的get方法:
	 *  //private String name;
	 *  //public string getName(){....}
	 *  //get方法名为:getName
	 * String excelName = new ExportUtils<实体类>().createExcel(startDate,endDate,"D:/"+fileName, columsName, list,fildGetStr);
	 * </pre>
	 * @最后更新 2019-06-28
	 * @作者 xiegang
	 * @return
	 */
	public String createExcel(String sDate,String eDate,String filePath,String[] colNames, List<T> list,String[] fieldGetStr){
		//处理标题
		String title = filePath.substring(filePath.lastIndexOf(File.separator)+1);
		String sheetName = title.substring(0,title.lastIndexOf("."));
		String date = null;
		if(sDate != null && sDate.length() > 0){
			String separation = "-";
			if(!sDate.matches("^\\d*$"))separation = "/";
			date = "日期:"+sDate+separation+eDate;
		}
		if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx")){
			return "创建Excel文件:"+title+"失败,具体原因:文件名不是以\".xls\"或\".xlsx\"结尾";
		}
		
		WritableWorkbook workbook = null;
		WritableSheet sheet = null;
		//开始处理数据
		try {
			//创建工作簿对象
			workbook = Workbook.createWorkbook(new File(filePath));
			//创建一个sheet页面
			sheet = workbook.createSheet(sheetName, 0);
			
			//初始化列标题样式
			WritableCellFormat thFormat = getCellFormat("等线", 12,true);
			thFormat.setBackground(Colour.GREY_25_PERCENT);// 设置单元格的背景颜色
			thFormat.setAlignment(Alignment.CENTRE); // 设置对齐方式
			thFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框
			// 添加列标题
			int col = colNames[0].equals("编号") || colNames[0].equals("序号") ? 1 : 0;//开始列
			int row = 0;//开始行
			for(int i=0;i<colNames.length;i++){
				sheet.addCell(new Label(i, row, colNames[i],thFormat));
			}
			row = 1;
			
			//初始化正文样式
			WritableCellFormat tdFormat = getCellFormat("等线", 10);
			tdFormat.setAlignment(Alignment.CENTRE); // 设置对齐方式
			tdFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框
			//填充数据
			
			//初始化Get方法
			fieldGetStr = intiGetStr(list, fieldGetStr);
			
			//根据字段处理数据
			for(int i = 0;i< list.size();i++){//T代表一行数据
				Method method = null;
				String attr = null;
				T t = list.get(i);
				for(int j = 0;j< fieldGetStr.length;j++){//每循环一次,得到一个属性值
					method = t.getClass().getMethod(fieldGetStr[j],new Class[]{});
					attr = String.valueOf(method.invoke(t, new Object[]{}));
					sheet.addCell(new Label(j+col, i+row, attr, tdFormat));
				}
				if(col == 1){
					sheet.addCell(new Label(col-1, row+i, String.valueOf(i+1), thFormat));
				}
			}
			
			autoSetCell(0, colNames.length, sheet);//自动设置单元格宽度
			
			//插入标题行
			sheet.insertRow(0);
			
			tdFormat = getCellFormat("等线", 16);
			tdFormat.setAlignment(Alignment.CENTRE);
			tdFormat.setVerticalAlignment(VerticalAlignment.CENTRE);//垂直居中对齐
			sheet.addCell(new Label(0,0,title,tdFormat));
			sheet.mergeCells(0, 0, (date == null ?colNames.length-1:colNames.length-2), 0);//合并
			
			//日期
			if(date!=null){
				tdFormat = getCellFormat("等线", 10);
				tdFormat.setAlignment(Alignment.LEFT);//水平靠右对齐
				tdFormat.setVerticalAlignment(VerticalAlignment.BOTTOM);//垂直靠下
				sheet.addCell(new Label(colNames.length-1,0,date,tdFormat));
			}
			sheet.setRowView(0, 500, false);
			workbook.write();
			workbook.close();
		} catch (Exception e) {
			e.printStackTrace();
			return "创建Excel文件:"+title+"失败,具体原因:"+e.fillInStackTrace();
		}
		return title;
	}
	
	/**
	 * <p>根据查询的列名生产Excel表格,不需要实体类<br><span style="color:red">说明:该方法适用于List<Map<key, value>>集合</span></p>
	 * <b>String createExcel(String 开始日期,String 结束日期,String 文件存放路径.xls,List<LinkedHashMap<String, Object>> 待导出的数据,
			String[] 列别名,String[] 数据库对应列名)</b></br>
	 * @描述 此方法实现了直接封装数据库查询的数据到Excel表格中,中间去掉了实体类的创建.使用的时候
	 * 需要注意的是数据库列名最好大写<pre>使用示例:
	 * List&lt;LinkedHashMap&lt;String,Object>> list = fh.getAllFhInfo();
	 * String[] colNames ={"序号","交易码","复核率","复核员","创建时间","修改时间"};
	 * String[] valNames ={"TRADECODE","FHPERCENT","FHUSERCODE","CREATETIME","UPDATETIME"};
	 * String string = ExportUtils.createExcel(null, null, "D:/交易信息表.xls", list, colNames, valNames);</pre>
	 * @作者 XieGang
	 * @创建时间 2018-9-4
	 * @更新时间 <font color="green">2019-06-28</font>
	 * @param strDate 开始日期,不需要的话填null
	 * @param endDate 结束日期,开始日期为null,该字段就无意义
	 * @param filePath 存放Excel文件的路径
	 * @param list 待封装到表格的数据集合
	 * @param colNames 列别名数组(每列叫什么名字)
	 * @param valNames 查询的sql中的列名数组(推荐都大写)
	 * @return Excel文件名
	 */
	public static String createExcel(String strDate, String endDate, String filePath, List<LinkedHashMap<String, Object>> list, String[] colNames, String[] valNames) {
		//处理标题
		String title = filePath.substring(filePath.lastIndexOf(File.separator)+1);
		String sheetName = title.substring(0,title.lastIndexOf("."));
		String date = null;
		if(strDate != null && strDate.length() > 0){
			String separation = "-";
			if(!strDate.matches("^\\d*$"))separation = "/";
			date = "日期:"+strDate+separation+endDate;
		}
		if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx")){
			return "创建Excel文件:"+title+"失败,具体原因:文件名不是以\".xls\"或\".xlsx\"结尾";
		}
		
		WritableWorkbook workbook = null;
		WritableSheet sheet = null;
		//开始处理数据
		try {
			//创建工作簿对象
			workbook = Workbook.createWorkbook(new File(filePath));
			//创建一个sheet页面
			sheet = workbook.createSheet(sheetName, 0);
			
			//初始化列标题样式
			WritableCellFormat thFormat = getCellFormat("等线", 12,true);
			thFormat.setBackground(Colour.GREY_25_PERCENT);// 设置单元格的背景颜色
			thFormat.setAlignment(Alignment.CENTRE); // 设置对齐方式
			thFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框
			// 添加列标题
			int col = colNames[0].equals("编号") || colNames[0].equals("序号") ? 1 : 0;//开始列
			int row = 0;//开始行
			for(int i=0;i<colNames.length;i++){
				sheet.addCell(new Label(i, row, colNames[i],thFormat));
			}
			row = 1;
			
			//初始化正文样式
			WritableCellFormat tdFormat = getCellFormat("等线", 10);
			tdFormat.setAlignment(Alignment.CENTRE); // 设置对齐方式
			tdFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框
			//填充数据
			LinkedHashMap<String, Object> tr = null;
			String td = null;
			for(int i=0;i<list.size();i++){//行
				tr = list.get(i);
				System.err.println("当前行数据:"+tr);
				for(int j=0;j<valNames.length;j++){//列
					td = String.valueOf(tr.get(valNames[j]));
					sheet.addCell(new Label(col+j, row+i, td,tdFormat));
//					sheet.getWritableCell(col+j, row+i).setCellFormat(format);
				}
				if(col == 1){
					sheet.addCell(new Label(col-1, row+i, String.valueOf(i+1), thFormat));
				}
			}
//			createTitle(title, sheet, 0, 0, colNames.length);
			autoSetCell(0, colNames.length, sheet);//自动设置单元格宽度
			
			//插入标题行
			sheet.insertRow(0);
			
			tdFormat = getCellFormat("等线", 16);
			tdFormat.setAlignment(Alignment.CENTRE);
			tdFormat.setVerticalAlignment(VerticalAlignment.CENTRE);//垂直居中对齐
			sheet.addCell(new Label(0,0,title,tdFormat));
			sheet.mergeCells(0, 0, (date == null ?colNames.length-1:colNames.length-2), 0);//合并
			
			//日期
			if(date!=null){
				tdFormat = getCellFormat("等线", 10);
				tdFormat.setAlignment(Alignment.LEFT);//水平靠右对齐
				tdFormat.setVerticalAlignment(VerticalAlignment.BOTTOM);//垂直靠下
				sheet.addCell(new Label(colNames.length-1,0,date,tdFormat));
			}
			sheet.setRowView(0, 500, false);
			workbook.write();
			workbook.close();
		} catch (Exception e) {
			return "创建Excel文件:"+title+"失败,具体原因:"+e.fillInStackTrace();
		}
		return title;
	}
	
	/**
	 * 获取一个指定字体名称和大小的单元格样式
	 * @param fontName 字体名称
	 * @param fontSize 字体大小
	 * @return
	 */
	public static WritableCellFormat getCellFormat(String fontName,int fontSize){
		//1 创建一个字体对象
		WritableFont font = new WritableFont(
				WritableFont.createFont(fontName), //字体
				fontSize, //字号
				WritableFont.NO_BOLD, //是否粗体 WritableFont.BOLD 是 WritableFont.NO_BOLD 否
				false, //是否斜体 ture 是,false 否
				UnderlineStyle.NO_UNDERLINE,//是否需要下滑线  UnderlineStyle.NO_UNDERLINE 不需要 UnderlineStyle.UNDERLINE 需要
				Colour.BLACK,//字体颜色 
				ScriptStyle.NORMAL_SCRIPT);
		//2 创建一个WritableCellFormat对象 并返回
		return new WritableCellFormat(font);
	}
	
	/**
	 * <b><font size="3" color="#339900">● </font><font size="3" color="black">getCellFormat( 
	 * 字体名称,字体大小,是否粗体 ):WritableCellFormat -- MyStringUtils</b></font><br/><b>● 描述:</b><font size="2" color="#cc66ff">
	 * 得到一个表格单元格格式化对象WritableCellFormat </font><br/><b>● 描述:</b><font size="2" color="#009933">
	 * 调用此方法可以得到一个单元格格式化对象WritableCellFormat,可以设置字体大小和字体名称和是否设置字体为粗体 </font><br /><b>● 返回值:</b> <font size="2" color="#cc9933">WritableCellFormat</font><br /><font size="2" color="#330099">
	 * @param fontName 字体名称
	 * @param fontSize 字体大小
	 * @param isBold 是否为粗体
	 * @return WritableCellFormat对象</font>
	 */
	public static WritableCellFormat getCellFormat(String fontName,int fontSize,boolean isBold){
		//1 创建一个字体对象
		WritableFont font = new WritableFont(
				WritableFont.createFont(fontName), //字体
				fontSize, //字号
				isBold ?WritableFont.BOLD: WritableFont.NO_BOLD, //是否粗体 WritableFont.BOLD 是 WritableFont.NO_BOLD 否
				false, //是否斜体 ture 是,false 否
				UnderlineStyle.NO_UNDERLINE,//是否需要下滑线  UnderlineStyle.NO_UNDERLINE 不需要 UnderlineStyle.UNDERLINE 需要
				Colour.BLACK,//字体颜色 
				ScriptStyle.NORMAL_SCRIPT);
		//2 创建一个WritableCellFormat对象 并返回
		return new WritableCellFormat(font);
	}
	
	/**
	 * <b><font size="3" color="#339900">● </font><font size="3" color="black">getCellFormat( 
	 * 字体名称,字体大小,是否粗体,是否斜体 ):WritableCellFormat -- MyStringUtils</b></font><br/><b>● 描述:</b><font size="2" color="#cc66ff">
	 * 得到一个表格单元格格式化对象WritableCellFormat </font><br/><b>● 描述:</b><font size="2" color="#009933">
	 * 调用此方法可以得到一个单元格格式化对象WritableCellFormat,可以设置字体大小和字体名称和是否设置字体为粗体和设置字体是否为斜体 </font><br /><b>● 返回值:</b> <font size="2" color="#cc9933">WritableCellFormat</font><br /><font size="2" color="#330099">
	 * @param isItalic 是否为斜体
	 * @param fontName 字体名称
	 * @param fontSize 字体大小
	 * @param isBold 是否为粗体
	 * @return WritableCellFormat对象</font>
	 */
	public static WritableCellFormat getCellFormat(String fontName,int fontSize,boolean isBold,boolean isItalic){
		//1 创建一个字体对象
		WritableFont font = new WritableFont(
				WritableFont.createFont(fontName), //字体
				fontSize, //字号
				isBold ? WritableFont.BOLD: WritableFont.NO_BOLD, //是否粗体 WritableFont.BOLD 是 WritableFont.NO_BOLD 否
				isItalic, //是否斜体 ture 是,false 否
				UnderlineStyle.NO_UNDERLINE,//是否需要下滑线  UnderlineStyle.NO_UNDERLINE 不需要 UnderlineStyle.UNDERLINE 需要
				Colour.BLACK,//字体颜色 
				ScriptStyle.NORMAL_SCRIPT);
		//2 创建一个WritableCellFormat对象 并返回
		return new WritableCellFormat(font);
	}
	
	/**
	 * <b><font size="3" color="#339900">● </font><font size="3" color="black">getCellFormat( 
	 * 字体名称,字体大号,是否粗体,是否斜体,是否下划线 ):WritableCellFormat -- MyStringUtils</b></font><br/><b>● 描述:</b><font size="2" color="#cc66ff">
	 * 得到一个表格单元格格式化对象WritableCellFormat </font><br/><b>● 描述:</b><font size="2" color="#009933">
	 * 调用此方法可以得到一个单元格格式化对象WritableCellFormat,可以设置字体大小和字体名称和是否设置字体为粗体和设置字体是否为斜体和设置字体是否有下划线</font><br /><b>● 返回值:</b> <font size="2" color="#cc9933">WritableCellFormat</font><br /><font size="2" color="#330099">
	 * @param isItalic 是否为斜体
	 * @param fontName 字体名称
	 * @param fontSize 字体大小
	 * @param isBold 是否为粗体
	 * @param isUnderLine 是否下划线
	 * @return WritableCellFormat对象</font>
	 */
	public static WritableCellFormat getCellFormat(String fontName,int fontSize,boolean isBold,boolean isItalic,boolean isUnderLine){
		//1 创建一个字体对象
		WritableFont font = new WritableFont(
				WritableFont.createFont(fontName), //字体
				fontSize, //字号
				isBold ? WritableFont.BOLD: WritableFont.NO_BOLD, //是否粗体 WritableFont.BOLD 是 WritableFont.NO_BOLD 否
				isItalic, //是否斜体 ture 是,false 否
				isUnderLine? UnderlineStyle.DOUBLE:UnderlineStyle.NO_UNDERLINE,//是否需要下滑线  UnderlineStyle.NO_UNDERLINE 不需要 UnderlineStyle.UNDERLINE 需要
				Colour.BLACK,//字体颜色 
				ScriptStyle.NORMAL_SCRIPT);
		//2 创建一个WritableCellFormat对象 并返回
		return new WritableCellFormat(font);
	}
	
	/**
	 * <b><font size="3" color="#339900">● </font><font size="3" color="black">createTitle( 
	 * 文件名,表格sheet对象,开始列,插入行,待合并列数 ):void -- MyStringUtils</b></font><br/><b>● 描述:</b><font size="2" color="#cc66ff">
	 * 在Excel中创建表格标题 </font><br/><b>● 描述:</b><font size="2" color="#009933">
	 * 在Excel中创建表格标题,可以指定在(x,y)处开始创建表格标题,其中 totalColums是需要合并的列数<br/>
	 * 示例:在excel表格坐标(5,6)指定位置创建表格,然后,合并5列 标题名是:textName<br/>参数对应的就是: 
	 * startColum=5;insertRow=6;totalColums= 5;fileName=textName</font><br /><b>● 返回值:</b> <font size="2" color="#cc9933">void</font><br /><font size="2" color="#330099">
	 * @param fileName 文件标题名
	 * @param sheet 表格页面对象
	 * @param startColum 开始列
	 * @param startRow 待新增行的行坐标
	 * @param totalColums 需要合并的列数
	 * @throws Exception WriteException和RowsExceededException</font>
	 */
	public static void createTitle(String fileName,WritableSheet sheet,int startColum,int startRow,int totalColums) throws Exception{
		sheet.insertRow(startRow == 0?0:startRow);
		//设置标题字体
		WritableCellFormat  cellFormat = getCellFormat("仿宋", 16, true);
		//居中显示
		cellFormat.setAlignment(Alignment.CENTRE);
		//添加进指定位置单元格
//		System.out.println("startColum"+startColum+",startRow"+startRow);
		sheet.addCell(new Label(startColum,startRow, fileName));
		//得到需要操作的单元格
		WritableCell cell = sheet.getWritableCell(startColum,startRow);
		//设置字体和样式
		cell.setCellFormat(cellFormat);
		/*合并单元格
			方法 WritableSheet.mergeCells(int m,int n,int p,int q);
			作用是从(m,n)到(p,q)的单元格全部合并[我的理解:m列、n行和p列、q行合并]
			示例:sheet.mergeCells(0, 0, 0, 1);//设置第一列、第一行和 第一列、第二行合并*/
		
		//合并当前行第insertRow列到insertRow+totalColums列.
		sheet.mergeCells(startColum, startRow, startColum+totalColums, startRow);
	}
	
	/**
	 * <p>自动根据内容设置列宽,保证每列都能完全显示内容<p>
	 * <b>autoSetCell( Integer 开始列, Integer 从开始列需要设置的列数,WritableSheet WritableSheet对象)</b></br>
	 * @param colStart 开始列
	 * @param colTotal 从开始列需要设置的列数
	 * @param sheet WritableSheet对象
	 * @throws UnsupportedEncodingException 
	 * @描述 这是一个自动设置导出表格单元格的方法,单元格最小宽度是63px,当列的内容超出最小宽度的时候,才会自动设置宽度
	 * @作者 XieGang
	 * @创建时间 2018年9月4日
	 */
	public static void autoSetCell( Integer colStart, Integer colTotal,WritableSheet sheet) throws UnsupportedEncodingException {
		int maxWidth = 0;
		Cell[] columns = null;
		for (int i = colStart; i < (colStart + colTotal); i++) {
			// 获取当前列的内容
			columns = sheet.getColumn(i);
			// 遍历,找到内容最长的列的宽度
			for (Cell cell : columns) {
				int n = cell.getContents().getBytes("gbk").length;
				if (maxWidth <= n) {
					maxWidth = n + 2;
				}
//				System.err.println(cell.getContents() + ":" + cell.getContents().length());
			}
			// 设置单元格列宽
			maxWidth = maxWidth < 9 ? 9 : maxWidth;
			sheet.setColumnView(i, maxWidth);
			// 重置最大列宽
			maxWidth = 9;
		}
	}
	
	/**
	 * <p></p>
	 * <b>int getWordCount()</b><hr>
	 * @param s
	 * @return
	 * @描述 TODO()
	 * @作者 XieGang
	 * @创建时间 2018-9-29
	 */
	 public  int getWordCount(String s){
	        s = s.replaceAll("[^\\x00-\\xff]", "**");
	        int length = s.length();
	        return length;
	    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值