java写excel文件及遇到的问题

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;

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

例如:
java写excel文件及遇到的问题_第1张图片
则需要有合并单元格,内容换行操作;
你可以这样:

我粗略的封装了一下:

  /***
     * 

* 创建使用说明的工作表 * * @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);

含表格数据的工作表

例如:java写excel文件及遇到的问题_第2张图片
在这里你可能需要设置表格里的文字和宽度
我的封装:

/**
     * 
     * 

* 生成工作表(表头并设置其宽度) * * @param wb:excel文件 * @param heetName:工作表名称 * @param header:表头显示信息,及其宽度(LinkedHashMap确保其顺序) * @return */ private HSSFSheet generatingSheetAtHeader (HSSFWorkbook wb, String sheetName, LinkedHashMap header) { HSSFSheet sheet2 = wb.createSheet (sheetName); HSSFRow sheet2HeaderRow = sheet2.createRow (0); int index = 0; for (Map.Entry 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  map1 = new LinkedHashMap  ();
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系统一贯不区分大小写,文件也是这样的。

你可能感兴趣的:(java,excel)