最近在做excel合并,之前一点也不了解java类操作excel,开始做之前不知道怎么做,还有点小紧张,不过看了之前系统有部分代码,再加上网上搜了些关于这方面的知识,现在把文档合并弄好了,好高兴,又学新知识啦,啦啦啦啦啦了!!!
1. 合并主方法
private String combine(List<String> list,String taskId,String modelName){
//合并附件
GetTogether comb = new GetTogether();
//合并附件后存放的位置
File file = new File(resultCombinepath);
if (!file.exists()) {
System.out.println("创建文件夹:"+file.getAbsolutePath());
//创建一个目录,它的路径名由当前 File 对象指定。
file.mkdirs();
}
String resultDocName = modelName.substring(0, modelName.length()-4) + "合并文档" + modelName.substring(modelName.length()-4, modelName.length());
//合并文档存储路径
String fileName = resultCombinepath+resultDocName;
file = new File(file,taskId+".xls");
int startRow = 0;// 开始合并行数
if(list.size() > 1){
startRow = decideStartRows(list.get(0));
}
for(int i=1;i<list.size();i++){
if(comb.Together(list.get(0), list.get(i), fileName, startRow)){
list.set(0, fileName);
}else{
return 0+":第"+i+"个文件合并失败!";
}
}
2.下面对上面代码中主要的合并方法comb.Together(list.get(0), list.get(i), fileName, startRow)进行记录
/**
* @param obj1 需要合并的第一个文档
* @param obj2 需要合并的第二个文档
* @param obj3 合并的最终文档
*/
@RemoteMethod
public boolean Together(Object obj1, Object obj2, Object obj3, int startRow) {
/* 合并的最终文档路径 */
name = (String) obj3;
try {
//创建对这两个工作薄的引用
first(obj1, obj2);
} catch(Exception e){
e.printStackTrace();
return false;
}
wb = Copy(wb1, name);
//对两个工作薄的工作表的引用
Sheet sheet2 = wb2.getSheetAt(0);
Sheet sheet = wb.getSheetAt(0);
Row row, row2;
//得到第一行(表头)
row2 = sheet2.getRow(startRow);
row = sheet.getRow(startRow);
Cell cell, cell2;
//两个表头共有的单元格数(列数)
ID = new int[row2.getLastCellNum() + row.getLastCellNum()];
int k = -1;
boolean b = false;
//比较表头信息,记录数组,以待下面信息复制使用
for (int i = 0; row2.getCell(i) != null; i++) {
int j = 0;
b = false;
//指定列的单元格对象
cell2 = row2.getCell(i);
for (j = 0; row.getCell(j) != null; j++) {
cell = row.getCell(j);
//判断单元格的值是否相同
if (cell.getStringCellValue().equals(cell2.getStringCellValue())) {
b = true;
break;
}
}
if (b) {
ID[++k] = j;
} else { //如果row2的某一列和row中的任何一列都不同,则将row2的这一列写到row中最后一列
ID[++k] = row.getLastCellNum();
row.createCell(row.getLastCellNum());
this.changeCellValue(row.getCell(row.getLastCallNum()-1),cell2);
}
}
//从第二行开始加数据
for (short i = (short)(startRow+1); i <= sheet2.getLastRowNum(); i++) {
row2 = sheet2.getRow(i);
addRow(ID, row2);
}
Save(wb, name);
return true;
}
/**
* 初始化WorkbookFactory
* @param obj1 需要合并的第一个文档
* @param obj2 需要合并的第二个文档
* @throws IOException
* @throws InvalidFormatException
*/
protected void first(Object obj1, Object obj2) throws Exception{
InputStream inp1 = null;
InputStream inp2 = null;
inp1 = new FileInputStream("" + (String) obj1);
inp2 = new FileInputStream("" + (String) obj2);
wb1 = WorkbookFactory.create(inp1);
wb2 = WorkbookFactory.create(inp2);
}
4.对上面Copy(wb1, name)代码记录
/**
*
* @param _wb1 要复制到的Workbook对象
* @param fileName
* @return 需要复制的Workbook的目标对象
*/
protected Workbook Copy(Workbook _wb1,String filename){
//将需要复制的_wb1输出到filename的excel中
Save(_wb1, filename);
//创建目标文件的引用
InputStream inp = null;
Workbook _wb = null;
try {
//根据目标文件的输入流,创建一个对目标文件的引用
inp = new FileInputStream("" + filename);
_wb = WorkbookFactory.create(inp);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return _wb;
}
/**
*
* @param _wb 需要保存的Workbook对象
* @param fileName 保存的目标对象路径
* @return 保存后的Workbook对象,第一层是时是生成空的目标文件空xls
*/
protected Object Save(Workbook _wb, String fileName){
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream("" + fileName);
//把_wb对象输出到fileName(如:合并文档.xls)中,及创建目标文件的xls,空的xls
_wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return _wb;
}
以上代码只是整体代码的梗概,但是已经描述出java操作excel的基本知识。进行文档合并,首先需要生成目标文件的excel:Save(_wb1,filename),然后再对需要复制的excel和已生成的目标文件引用,最后就可以通过excel读取行列等知识进行复制操作了