POI(3)

来源:互联网 发布:淘宝怎么搜好看的鞋子 编辑:程序博客网 时间:2024/06/04 20:05
一般在项目中真正要实现这样一个表格的时候,例如项目需要制作报表等等,通常的做法都是事先把格式一切的东西都手动制作好(这个做好了的文件在实际的项目里我们称之为“数据模板”,简称“模板”),然后在Java应用中适当的时机把这个文件读进来修改,最后再另存到指定的位置或者传递给下一个处理者(例如以流的方式送给Servlet等等),这样其实POI具体做的事情就是向模板里写业务的数据,还是很方便快捷的。

一POI 读取Excel 基本工作

   1. // 指定要读取的文件,本例使用上面生成的helloworld.xls

              FileInputStream readFile = new FileInputStream("c:/ceshi.xls");

       // 创建一个WorkBook,从指定的文件流中创建,即上面指定了的文件流

         HSSFWorkbook wb = new HSSFWorkbook(readFile);

       // 获取名称为“测试页”的sheet

       // 注意,如果不能确定具体的名称,可以用getSheetAt(int)方法取得Sheet

       //HSSFSheet st = wb.getSheet("测试页");

              HSSFSheet st = wb.getSheetAt(0);

     //创建样式表,样式表可以设置单元格的一些属性 比如背景色,锁定状态,行列宽高等

     HSSFCellStyle normalStyle = wb.createCellStyle();

     //以下列方式存储当前单元格样式

单元格对象.setCellStyle(normalStyle);


二设置模板与建立行和列

1. 如果预先的模板有内容的话,在操作的时候则只需要读去当前单元格的内容以及样式,或者可以重新定义。(如果没有内容,又想以读去的方式来获取Excel的话,需要手动初始化模板,如给模板中需要用到的单元格设置边框或者背景色等)

例如

HSSFRow row = st.getRow(0);       //读取第一行

HSSFCell cell = row.getCell((short)0); //读取第一行第一个字段

2. 如果模板中无内容的话,则需要在代码中创建初始化行和列来达到目的

例如

HSSFRow row = st.createRow(0);        //创建第一行

HSSFCell cell = row.createCell((short)0); //以第一行为基础创建第一列

三模板的只读单元格功能与POI关系

在Excel中可以设置某些单元格为锁定状态(即:只读状态),设置好后还不能生效,因为要通过点击工具—保护—保护工作表,输入密码达到效果,在选择保护工作表项目中可以控制只读的属性(具体看需求):如不能修改样式名称,可以修改行列大小或者删除行列,还有个选项是选定锁定单元格,如果把这个钩选取消了,则只读时点击不到被设置只读保护的单元格,也不会出现不能修改属性的提示框。
如果我们需要这些只读的单元格的功能的话,则需要在模板中设置,通过POI来读取后再生成的EXCEL 也会保留此功能,还可以通过POI在读取模板后设置哪些字段为锁定状态:

HSSFCellStyle alterableStyle = wb.createCellStyle(); //获取当前单元格的样式对象

alterableStyle.setLocked(true);    //设定此单元格为锁定状态

如果在选择模板EXCEL不需要设置只读的属性时候(即:默认属性)则可以不用在模板中选择保护工作表,同样可以在POI中实现例

 st.protectSheet(new String("333")); //当前工作表为保护状态 密码为333

(需知:设置只读属性的允许删除行和列的选项时,如果当前行或者列 有已经被设定为锁定的单元格时,则此列或者行不能被删除)

四 安全问题

由于模板需要受到保护,建议在建立模板的时候 设置保护工作表 另外最好可以找到工作以锁定模板的VBA工程窗口,这样POI读取模板后生成的EXCELVBA工程窗口也自动被锁定, 以防止破解 模板的工作表密码

public void test() {
try{

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(-#34;new sheet-#34;);

// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow((short)0);
// Create a cell and put a value in it.
HSSFCell cell = row.createCell((short)0);
cell.setCellValue(1);

// Or do it on one line.
row.createCell((short)1).setCellValue(1.2);
row.createCell((short)2).setCellValue(-#34;This is a string-#34;);
row.createCell((short)3).setCellValue(true);
row.createCell((short)3).setCellValue(-#34;这是中文字符-#34;);


// Write the output to a file
FileOutputStream fileOut = new FileOutputStream(-#34;c:/workbook.xls-#34;);
wb.write(fileOut);
fileOut.close();
}catch(Exception ex){

}

}
我写的一列row.createCell((short)3).setCellValue(-#34;这是中文字符-#34;);
这样就出乱码了,请指教

--------------------------------------------------------------------------------

//先设置编码
cell.setEncoding(HSSFCell.ENCODING_UTF_16);

//设置值 统一为String
cell.setCellValue(dataValue);

--------------------------------------------------------------------------------

谢谢,我现在的操作系统是XP 英文版的。

用楼上的方法还是乱码,我是用Eclipse编译的。

--------------------------------------------------------------------------------

我也有这个问题,我是2000  
用// cell.setCellValue(-#34;中文-#34;);可以
但用 row.createCell((short)3).setCellValue(-#34;这是中文字符-#34;);
就是乱码

--------------------------------------------------------------------------------

jxl写excel
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.Sheet;
import jxl.write.Label;
import jxl.Cell;
import jxl.write.WritableWorkbook;
import jxl.write.WritableSheet;
import jxl.write.WriteException;

public void exportExcelFile(String outputFile, List dataList) throws Exception
{

//创建工作表与sheet的引用
WritableWorkbook wb = null;
WritableSheet ws = null;
//直接根据输出的文件创建工作表对象
try
{
wb = Workbook.createWorkbook(new File(outputFile));
//创建第一页的sheet
ws = wb.createSheet(-#34;sheet1-#34;, 0);
//循环导出数据
for (int rowId = 0; rowId -#60; dataList.size(); rowId++)
{
//得到对应行的数据列表
List valueList = (List) dataList.get(rowId);
//循环每一个单元格
for (int column = 0; column -#60; valueList.size(); column++)
{
//得到对应单元格的值
String value = (String) valueList.get(column);
//设置值
Label label = new Label(column, rowId, value);
//加到sheet上
ws.addCell(label);
}
}
//输出到文件
wb.write();
//关闭文件
wb.close();
}
catch(Exception e)
{

}
}
poi 写excel
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.poifs.filesystem.POIFSFileSystem;

public List parseExcelFile( InputStream inputStream ) throws PMSBusinessException
{
//设置通用对象列表
List dataList = new ArrayList();
List valueList = null;
//以文件流构造workbook
HSSFWorkbook workbook = null;
workbook = new HSSFWorkbook(inputStream);
int sheetNum = workbook.getNumberOfSheets();
//得到第一个sheet对象
HSSFSheet templateSheet = workbook.getSheetAt(1);
HSSFRow templateRow = templateSheet.getRow(0);
//得到总行数
int rowNum = templateSheet.getPhysicalNumberOfRows();
//得到总列数
int columnNum = templateSheet.getRow(0).getPhysicalNumberOfCells();
//循环每一行
for (int rowId = 0; rowId -#60; rowNum; rowId++)
{
//得到第rowId行对象
HSSFRow hsrow = templateSheet.getRow(rowId);
//创建一个值列表对象 分别存放每一个字段对应的值
valueList = new ArrayList();
//循环每一列
for (int columnId = 0; columnId -#60; columnNum; columnId++)
{
String value = null;
//得到一个单元格
if(hsrow == null)
return dataList;

HSSFCell cell = hsrow.getCell((short) columnId);
//取模板第一个单元格
HSSFCell templateCell = templateRow.getCell((short) columnId);
//取得列名称
String columnName = templateCell.getStringCellValue().trim();
//只有单元格中有值时才做类型判断
if (cell != null)
{
//得到类型
int cellType = cell.getCellType();
switch (cellType)
{
//如果是空串
case HSSFCell.CELL_TYPE_BLANK :
value = -#34;-#34;;
break;
//如果是布尔型
case HSSFCell.CELL_TYPE_BOOLEAN :
value = cell.getBooleanCellValue() ? -#34;TRUE-#34; : -#34;FALSE-#34;;
break;
//如果是错误型
case HSSFCell.CELL_TYPE_ERROR :
value = -#34;#ERR-#34; + cell.getErrorCellValue();
break;
//如果是公式型
case HSSFCell.CELL_TYPE_FORMULA :
value = cell.getCellFormula();
break;
//如果是数字型
case HSSFCell.CELL_TYPE_NUMERIC :
//判断一下是否是日期类型
if (HSSFDateUtil.isCellDateFormatted(cell))
{
//转为yyyy-MM-dd格式
DateFormat sdf = new SimpleDateFormat(-#34;yyyy-MM-dd-#34;);
value = sdf.format(cell.getDateCellValue());
}
//否则是数字
else
{

if ( -#34;编号-#34;.equals( columnName )
|| -#34;时限-#34;.equals( columnName ) )
{
//转为整数的字符串
value =-#34;-#34;+(long)cell.getNumericCellValue();
}
//其他全部转为小数型字符串
else
{
value = cell.getNumericCellValue() + -#34;-#34;;
}
}
break;
//字符串型
case HSSFCell.CELL_TYPE_STRING :
value = cell.getStringCellValue();
break;
//其它
default :
value = -#34;Unknown Cell Type: -#34; + cell.getCellType();
}
}
//把转化后的值放入List 这里list中可能放入null 代表没有值
valueList.add(value);
}
}
//返回通用列表全部为String 类型 或 Null
return dataList;
}


--------------------------------------------------------------------------------

导出有模板文件的excel
public void exportStyleFile(String inputFile, String outputFile, List dataList) throws PMSBusinessException
{
POIFSFileSystem fs = null;
HSSFWorkbook templatewb = null;
//用模板文件构造poi
try
{
fs = new POIFSFileSystem(new FileInputStream(inputFile));
//创建模板工作表
templatewb = new HSSFWorkbook(fs);
}
catch (FileNotFoundException e)
{
e.printStackTrace(System.out);
}
catch (IOException e)
{
e.printStackTrace(System.out);
}

//直接取模板第一个sheet对象
HSSFSheet templateSheet = templatewb.getSheetAt(1);
//得到模板的第一个sheet的第一行对象 为了得到模板样式
HSSFRow templateRow = templateSheet.getRow(0);
//取得Excel文件的总列数
int columns = templateSheet.getRow((short) 0).getPhysicalNumberOfCells();
//创建样式数组
HSSFCellStyle styleArray[] = new HSSFCellStyle[columns];
//一次性创建所有列的样式放在数组里
for (int s = 0; s -#60; columns; s++)
{
//得到数组实例
styleArray[s] = templatewb.createCellStyle();
}
//循环对每一个单元格进行赋值 这里要求模板的列序与list中的值要一一对应
//定位行
for (int rowId = 1; rowId -#60;= dataList.size(); rowId++)
{
//依次取第rowId行数据 每一个数据是valueList
List valueList = (List) dataList.get(rowId - 1);
//定位列
for (int columnId = 0; columnId -#60; valueList.size(); columnId++)
{
//依次取出对应与colunmId列的值
//每一个单元格的值
String dataValue = (String) valueList.get(columnId);
//取出colunmId列的的style
//模板每一列的样式
HSSFCellStyle style = styleArray[columnId];
//取模板第colunmId列的单元格对象
//模板单元格对象
HSSFCell templateCell = templateRow.getCell((short) columnId);
//创建一个新的rowId行 行对象
//新建的行对象
HSSFRow hssfRow = templateSheet.createRow(rowId);
//创建新的rowId行 columnId列 单元格对象
//新建的单元格对象
HSSFCell cell = hssfRow.createCell((short) columnId);
//如果对应的模板单元格 样式为非锁定
HSSFFont font = templatewb.createFont();
String columnName = templateCell.getStringCellValue().trim();
//如果是不准修改的列则红色显示字体
if(columnId==0 || columnId==1 ||columnId== 2 || columnId==3 || columnId == 5 || columnId == 7 || columnId== 13|| columnId==15)
{
//设置此列style为非锁定
//style.setLocked(false);
font.setColor(HSSFFont.COLOR_RED);
style.setFont(font);
//设置到新的单元格上
cell.setCellStyle(style);
}
//否则样式为锁定 普通颜色
else
{
//设置此列style为锁定
//style.setLocked(true);
font.setColor(HSSFFont.COLOR_NORMAL);
style.setFont(font);
//设置到新单元格上
cell.setCellStyle(style);
}
//设置编码
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
//设置值 统一为String
cell.setCellValue(dataValue);
}
}
//设置输入流
FileOutputStream fOut = null;;
try
{
fOut = new FileOutputStream(outputFile);
//将模板的内容写到输出文件上
templatewb.write(fOut);
fOut.flush();
//操作结束,关闭文件
fOut.close();
}
catch (FileNotFoundException e1)
{
e1.printStackTrace(System.out);

}
}

--------------------------------------------------------------------------------

no格式
public void exportExcelFile(String outputFile, List dataList)
//创建工作表
HSSFWorkbook workbook = new HSSFWorkbook();
//创建sheet
HSSFSheet sheet = workbook.createSheet();
//循环导出
for (int rowId = 0; rowId -#60; dataList.size(); rowId++)
{
//取出对应行的数据列表对象
List valueList = (List) dataList.get(rowId);
//从第0行开始创建
HSSFRow hsrow = sheet.createRow(rowId);
//依次写入每一个单元格
for (int columnId = 0; columnId -#60; valueList.size(); columnId++)
{
//得到对应单元格的值
String dataValue = (String) valueList.get(columnId);
//创建该行的单元格
HSSFCell cell = hsrow.createCell((short) columnId);
//设置编码
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
//设置值
cell.setCellValue(dataValue);
}
}
//写出到文件
FileOutputStream os;
try
{
os = new FileOutputStream(outputFile);
workbook.write(os);
os.flush();
//关闭文件流
os.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace(System.out);
}
}

原创粉丝点击