java写excel文件及遇到的问题

1 篇文章 0 订阅

java写excel文件及遇到的问题

最近做了导出excel文件的功能,在此记录一下我遇到的问题,并对方法进行了简单的封装.

需要导入的jar包

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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.ss.util.CellRangeAddress;

如果你要生成一个工作表专门做使用说明

例如:
这里写图片描述
则需要有合并单元格,内容换行操作;
你可以这样:

我粗略的封装了一下:

  /***
     * <p>
     * 创建使用说明的工作表
     * 
     * @param wb:excel文件
     * @param rowStart:合并单元格的下标,小于0表示不合并
     * @param rowEnd
     * @param colStart
     * @param colEnd
     * @param content:说明内容
     */
    private void generatingSheetTemplate (HSSFWorkbook wb, int rowStart, int rowEnd, int colStart, int colEnd,String content,String sheetName)
    {
        HSSFSheet sheet1 = wb.createSheet (sheetName);
        HSSFRow sheet1Row1 = sheet1.createRow (0);
        HSSFCell sheet1Cell = sheet1Row1.createCell (0);
        HSSFCellStyle cellStyle = wb.createCellStyle ();
        // 设置样式自动换行,顶部垂直[配合/r/n强制换行]
        cellStyle.setWrapText (true);
        cellStyle.setVerticalAlignment (HSSFCellStyle.VERTICAL_TOP);
        sheet1Cell.setCellStyle (cellStyle);
        sheet1Cell.setCellValue (new HSSFRichTextString (content));//换行这里需要这个对象,否则强制换行不生效
        // 合并单元格操作
        if (rowStart >= 0 && rowEnd >= 0 && colStart >= 0 && colEnd >= 0)
        {
            sheet1.addMergedRegion (new CellRangeAddress (rowStart, rowEnd, colStart, colEnd));
        }
    }

上面例子生成代码(着重注意/r/n这是强制换行):

HSSFWorkbook wb = new HSSFWorkbook ();
            String content = "模版使用说明:\r\n" 
            + "1、父类元数据分类应该出现在子元数据分类之前\r\n"
            + "2、每元数据分类下的具体元数据存储在单独的书签中,其命名规则为“元数据-”加上"
            + "元数据分类的类别编码,如有以编码为“001”的元数据分类,那么其下面的具体元数据"
            + "应存储在命名为“元数据-001”的书签中,如果该编码为“001”的元数据分类有一个编码"
            + "为“000”的父级分类,则其下面的具体元数据应存储在命名"
            + "为“元数据-000.001”的书签中。\r\n"
            +"3、“字段名”列:如果暂时不能确定该列值可留空、待定义数据集时再在界面上修改即可\r\n"
            +"4、“标准代码标识”列:如果该元数据有标准代码则该列值为“1”否则为“0”;"
            + "并且如果有标准代码时“标准代码”列的值应该来自于《标准代码导入模板.xls》"
            + "中“标准代码描述”sheet页的“标准代码编码”列对应的值\r\n"
            + "5、“最小值”、“最大值”、“小数位”、“剂量单位”、“数据来源”列,如果"
            + "找不到对应的值,留空即可\r\n"
            + "6、元数据编码的格式:如果是国标或卫生部标准提供的元"
            + "数据请按相应的编码规则进行编码,否则按CF+大类编码+小类编码+流水号的形式保存";
            String sheetName="模板使用声明";
            // 生成模板说明工作表
            generatingSheetTemplate (wb, 0, 24, 0, 11, content,sheetName);

含表格数据的工作表

例如:这里写图片描述
在这里你可能需要设置表格里的文字和宽度
我的封装:

/**
     * 
     * <p>
     * 生成工作表(表头并设置其宽度)
     * 
     * @param wb:excel文件
     * @param heetName:工作表名称
     * @param header:表头显示信息,及其宽度(LinkedHashMap确保其顺序)
     * @return
     */
    private HSSFSheet generatingSheetAtHeader (HSSFWorkbook wb, String sheetName,
                                               LinkedHashMap <String, Integer> header)
    {
        HSSFSheet sheet2 = wb.createSheet (sheetName);
        HSSFRow sheet2HeaderRow = sheet2.createRow (0);
        int index = 0;
        for (Map.Entry <String, Integer> entry : header.entrySet ())
        {
            String headerName = entry.getKey ();
            Integer width = entry.getValue ();
            sheet2.setColumnWidth (index, width);
            HSSFCell sheet2cell = sheet2HeaderRow.createCell (index);
            sheet2cell.setCellValue (headerName);
            index++;
        }
        return sheet2;
    }

例子的生成:

String sheetName = "数据元版本";
LinkedHashMap <String, Integer> map1 = new LinkedHashMap <String, Integer> ();
map1.put ("版本编码", Integer.valueOf (30 * 256));
map1.put ("版本名称", Integer.valueOf (30 * 256));
map1.put ("版本描述", Integer.valueOf (30 * 256));
HSSFSheet sheet1 = generatingSheetAtHeader (wb, sheetName, map1);
if (null != baseDataVersion)
    {
        HSSFRow sheet1Row2 = sheet1.createRow (1);
        HSSFCell sheet1cell = sheet1Row2.createCell (0);
        sheet1cell.setCellValue (baseDataVersion.getVersionCode ());
        sheet1cell = sheet1Row2.createCell (1);
        sheet1cell.setCellValue (baseDataVersion.getVersionName ());
        sheet1cell = sheet1Row2.createCell (2);
        sheet1cell.setCellValue (baseDataVersion.getVersionDes ());
    }

有关生成excel表格文件的问题

1.换行问题(上面提过了)
2.工作表的命名问题:

工作表的命名不允许重复,且不区分大小写,如你的一个工作表的名称为A100,然而在这个excel文件中就不能创建a100的工作表了,更不要说在建一个A100,这会报错的,请注意!原因:WINDOWS系统一贯不区分大小写,文件也是这样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值