java exl导出通用版

/**
 * Excel实体BEAN的属性注解
 * @author Y.j
 * 2013-9-2下午02:50:37
 * 此类为注解类,在所建立的实体BEAN中,对应的属性进行注解 
 */
@Documented  
@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.FIELD)
public @interface ExcelAnnotation {
 
 String name();//Excel列名
 int width();//Excel列宽
 int id();//Excel列ID
 
}


import java.lang.reflect.Field;
import java.util.Comparator;


@SuppressWarnings("unchecked")
public class FieldComparator implements Comparator {

    public int compare(Object arg0, Object arg1) {
        Field fieldOne = (Field)arg0;
        Field fieldTwo = (Field)arg1;
        ExcelAnnotation annoOne = fieldOne.getAnnotation(ExcelAnnotation.class);
        ExcelAnnotation annoTwo = fieldTwo.getAnnotation(ExcelAnnotation.class);
        return annoOne.id()-annoTwo.id();
    }

}  



import java.io.FileOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

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

/**
 * 生成Excel
 * 
 * @param models 封装需要到处的数据BEAN结合
 * @param className 导成Excel的实体BEAN包名.类名
 * @param tempPath 生成Excel存放的临时路径
 * @param excelName 生成的Excel名
 */
public class PrintExlUtil {

@SuppressWarnings("unchecked")
public static void createExcel(List models, String className,String tempPath, String excelName) throws Exception {
Class clasVo = null;

clasVo = Class.forName(className);
OutputStream os = new FileOutputStream(tempPath + "\\" + excelName
+ ".xls");
WritableWorkbook workbook = Workbook.createWorkbook(os);
WritableSheet sheet = workbook.createSheet(excelName, 0);
// 用于标题
WritableFont titleFont = new WritableFont(WritableFont.ARIAL, 17,
WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE,
jxl.format.Colour.WHITE);
WritableCellFormat wcf_title = new WritableCellFormat(titleFont);
wcf_title.setBackground(Colour.TEAL, Pattern.SOLID);
wcf_title.setBorder(Border.ALL, BorderLineStyle.DOUBLE,
Colour.OCEAN_BLUE);
wcf_title.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
wcf_title.setAlignment(Alignment.CENTRE);

// 用于正文
WritableFont NormalFont = new WritableFont(WritableFont.TAHOMA, 11);
WritableCellFormat wcf_center = new WritableCellFormat(NormalFont);
wcf_center.setBorder(Border.ALL, BorderLineStyle.DOUBLE,
Colour.GRAY_25);
wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
wcf_center.setAlignment(Alignment.CENTRE);
wcf_center.setWrap(true); // 是否换行

sheet.addCell(new Label(0, 0, excelName, wcf_title));
sheet.mergeCells(0, 0, clasVo.getDeclaredFields().length - 1, 0);

// 获取属性
Field[] fields = clasVo.getDeclaredFields();
//按照注解id排序Excel列
Arrays.sort(fields, new FieldComparator());
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
if (field.isAnnotationPresent(ExcelAnnotation.class)) {
//获取该字段的注解对象
ExcelAnnotation anno = field
.getAnnotation(ExcelAnnotation.class);
sheet.setColumnView(i, anno.width());
sheet.addCell(new Label(i, 1, anno.name(), wcf_center));
}
}

int rowId = 2;// 写入第几行 第一行为列头 数据从第二行开始写
for (Object ssTopModel : models) {
int columnId = 0;// 写入第几列 第一列为自动计算的行号 数据从第二列开始写
// 获取该类 并获取自身方法
Class clazz = ssTopModel.getClass();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
if (field.isAnnotationPresent(ExcelAnnotation.class)) {
String methodName = "get"
+ field.getName().substring(0, 1).toUpperCase()
+ field.getName().substring(1);
Method method = clazz.getMethod(methodName);
try {
sheet
.addCell(new Label(columnId, rowId, method
.invoke(ssTopModel) == null ? ""
: method.invoke(ssTopModel)
.toString(), wcf_center));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
columnId++;
}
}
rowId++;
}

workbook.write();
workbook.close();
os.flush();
os.close();
}
}


/***
最后建立实体BEAN
对对应的属性进行相应的标注
**/  
如:

@ExcelAnnotation(name="卷烟代码",width=20,id=1)
private String cigCode;//卷烟代码

 并需要对应的
jxl.jar 包
要将Python中的数据导出到Excel文件中,可以使用第三方库如 pandas 或 xlsxwriter。 以下是使用 pandas 的示例代码: ```python import pandas as pd # 创建数据 data = {'姓名': ['小明', '小红', '小刚'], '年龄': [18, 20, 22], '性别': ['男', '女', '男']} # 将数据转为 DataFrame df = pd.DataFrame(data) # 导出到 Excel 文件 df.to_excel('output.xlsx', index=False) ``` 以上代码将创建一个包含姓名、年龄和性别的数据表格,然后将其导出到名为 output.xlsx 的 Excel 文件中。`index=False` 表示不包含行索引。 如果你想要更加灵活地控制导出的 Excel 文件格式,可以使用 xlsxwriter 库。以下是使用 xlsxwriter 的示例代码: ```python import xlsxwriter # 创建 Excel 文件和工作表 workbook = xlsxwriter.Workbook('output.xlsx') worksheet = workbook.add_worksheet() # 写入数据 data = {'姓名': ['小明', '小红', '小刚'], '年龄': [18, 20, 22], '性别': ['男', '女', '男']} # 写入表头 header_format = workbook.add_format({'bold': True}) for col_num, value in enumerate(data.keys()): worksheet.write(0, col_num, value, header_format) # 写入数据 for row_num, row_data in enumerate(zip(*data.values())): for col_num, value in enumerate(row_data): worksheet.write(row_num + 1, col_num, value) # 关闭 Excel 文件 workbook.close() ``` 以上代码将创建一个包含姓名、年龄和性别的数据表格,并将其导出到名为 output.xlsx 的 Excel 文件中。在这个示例中,我们使用了 xlsxwriter 库来手动控制表格格式,包括添加表头和设置粗体字体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值