在项目开发过程中,我们经常都会遇到对excel文件的相关操作,本文主要讲解的是对多个excel文件进行合并的操作。
在讲解之前,有必要说明这两种工具的使用场景和区别。jxl目前仅支持后缀格式为xls的excel文件,像Excel2007版本后缀为xlsx的文件暂时还不支持。poi目前可以支持excel后缀格式为xls与xlsx的文件。其他的区别有兴趣可以自己去网络上搜索下。
一. 使用jxl工具合并多个后缀为xls的excel文件,直接贴上代码。
1. package com.bacs.buz.util;
2. import java.io.File;
3. import java.io.IOException;
4. import java.util.ArrayList;
5. import java.util.List;
6. import com.xingyi.bacs.util.LogUtil;
7. import jxl.Cell;
8. import jxl.Sheet;
9. import jxl.Workbook;
10. import jxl.write.Label;
11. import jxl.write.WritableCellFormat;
12. import jxl.write.WritableFont;
13. import jxl.write.WritableSheet;
14. import jxl.write.WritableWorkbook;
15. import jxl.write.WriteException;
16. import jxl.write.biff.RowsExceededException;
17. public class JXLMergerWriteExcelUtil {
18.
19. private WritableCellFormat times;
20. private String createFilePath;//合成文件存放路径
21. private int beginMergerColumnIndex=0;//开始合并的列
22. private int endMerGerColumnIndex;//结束的合并的列
23. //private long headRowIndex;//列头所在位置
24. private int beginMergerRow=1;//开始合并的行标
25. private List<String> columns=null;
26. private String dirPath;
27. private int mergerRowBeginIndex=0;
28. public JXLMergerWriteExcelUtil(String createFilePath,String path){
29. this.createFilePath = createFilePath;
30. this.dirPath=path;
31. }
32. public JXLMergerWriteExcelUtil(String createFilePath,String path,int beginMergerRow){
33. this.createFilePath = createFilePath;
34. this.dirPath=path;
35. this.beginMergerRow=beginMergerRow;
36. }
37. public JXLMergerWriteExcelUtil(String createFilePath,String path,int beginMergerColumnIndex,int endMerGerColumnIndex,int beginMergerRow){
38. this.createFilePath = createFilePath;
39. this.dirPath=path;
40. this.beginMergerColumnIndex=beginMergerColumnIndex;
41. this.endMerGerColumnIndex=endMerGerColumnIndex;
42. this.beginMergerRow=beginMergerRow;
43. }
44.
45.
46. /*******
47. * 写文件
48. * @throws IOException
49. * @throws WriteException
50. * @throws Exception
51. */
52. public String mergerExcel() {
53. LogUtil.info(JXLMergerWriteExcelUtil.class, "开始合并文件");
54. WritableWorkbook workbook=null;
55. Workbook book=null;
56. try{
57. if(createFilePath==null){
58. return "请输入创建文件路径";
59. }
60. if(dirPath==null){
61. return "请输入被合并文件夹的路径";
62. }
63. File file = new File(createFilePath);
64. LogUtil.info(JXLMergerWriteExcelUtil.class, "主文件名路径为:"+createFilePath);
65. book=Workbook.getWorkbook(file);
66. workbook=Workbook.createWorkbook(file, book);
67. WritableSheet excelSheet = workbook.getSheet(0);
68. this.beginMergerColumn(excelSheet);
69. workbook.write();
70. LogUtil.info(JXLMergerWriteExcelUtil.class, "结束合并文件");
71. return "0";
72. }catch(Exception e){
73. e.printStackTrace();
74. return "1";
75. }finally{
76. if(workbook!=null){
77. try {
78. workbook.close();
79. } catch (WriteException e) {
80. e.printStackTrace();
81. } catch (IOException e) {
82. e.printStackTrace();
83. }
84. }
85. if(book!=null){
86. book.close();
87. }
88. }
89. }
90.
91. /*****
92. * 开始合并文件
93. * @param excelSheet
94. * @param dirPath
95. */
96. private void beginMergerColumn(WritableSheet excelSheet ){
97. File srcFile = new File(dirPath);
98. LogUtil.info(JXLMergerWriteExcelUtil.class, "需要合并的文件名路径为:"+dirPath);
99. String path= srcFile.getAbsolutePath();
100. LogUtil.info(JXLMergerWriteExcelUtil.class, "====合并excel文件----请稍等====");
101. try {
102. this.readSingleExcel(excelSheet,path);
103. } catch (Exception e) {
104. e.printStackTrace();
105. }
106. }
107.
108. /*****
109. * 读取单个文件
110. * @param excelSheet 主excel
111. * @param singFilePath 需要合并的文件路径
112. */
113. public void readSingleExcel(WritableSheet excelSheet,String singFilePath){
114. File inputWorkbook = new File(singFilePath);
115. Workbook w = null;
116. try {
117. w = Workbook.getWorkbook(inputWorkbook);
118. Sheet sheet = w.getSheet(0);
119. mergerRowBeginIndex=excelSheet.getRows();
120. LogUtil.info(JXLMergerWriteExcelUtil.class, "主文件名开始合并开始值为:"+mergerRowBeginIndex);
121. endMerGerColumnIndex=excelSheet.getColumns();
122. LogUtil.info(JXLMergerWriteExcelUtil.class, "需要合并的数量为:"+(sheet.getRows()-1));
123. for (int i = beginMergerRow; i < sheet.getRows(); i++) {
124. for (int j = beginMergerColumnIndex; j < endMerGerColumnIndex; j++) {
125. Cell cell = sheet.getCell(j, i);
126. String cell_value=cell.getContents();
127. /*if(j==0){
128. if(cell_value!=""){
129. cell_value=String.valueOf(Integer.parseInt(cell_value)+mergerRowBeginIndex);
130. }
131. }*/
132. this.addLabel(excelSheet, j, mergerRowBeginIndex, cell_value);
133. }
134. mergerRowBeginIndex++;
135. }
136. } catch (Exception e) {
137. e.printStackTrace();
138. }finally{
139. if(w!=null){
140. w.close();
141. }
142. }
143. }
144. /*****
145. * 创建表头
146. * @param excelSheet
147. * @param firstFilePath
148. */
149. private void createHeader(WritableSheet excelSheet,String firstFilePath){
150. int column=0;
151. try{
152. this.readFirstFileGetHeaders(firstFilePath);
153. for(int i=beginMergerColumnIndex;i<endMerGerColumnIndex;i++){
154. this.addLabel(excelSheet, column++, 0, columns.get(i));
155. }
156. this.addLabel(excelSheet, excelSheet.getColumns()-1, 0, "来源文件名称");
157. }catch(Exception e){
158. e.printStackTrace();
159. }
160. }
161. /*****
162. * 读取单个文件获取文件的表头信息
163. * @param filePath
164. */
165. private void readFirstFileGetHeaders(String filePath){
166. File inputWorkbook = new File(filePath);
167. Workbook w = null;
168. try {
169. w = Workbook.getWorkbook(inputWorkbook);
170. // Get the first sheet
171. Sheet sheet = w.getSheet(0);
172. // Loop over first 10 column and lines
173. columns=new ArrayList<String>();
174. for (int i = 0; i < sheet.getRows(); i++) {
175. for (int j = 0; j < sheet.getColumns(); j++) {
176. Cell cell = sheet.getCell(j, i);
177. String cell_value=cell.getContents();
178. columns.add(cell_value);
179. }
180.
181. endMerGerColumnIndex=sheet.getColumns();
182. break;
183. }
184. } catch (Exception e) {
185. // TODO Auto-generated catch block
186. e.printStackTrace();
187. }finally{
188. if(w!=null){
189. w.close();
190. }
191. }
192. }
193. /*****
194. * 添加信息到excel中
195. * @param sheet
196. * @param column
197. * @param row
198. * @param s
199. * @throws WriteException
200. * @throws RowsExceededException
201. */
202. private void addLabel(WritableSheet sheet, int column, int row, String s)
203. throws WriteException, RowsExceededException {
204. Label label;
205. // Lets create a times font
206. WritableFont times10pt = new WritableFont(WritableFont.TIMES, 10);
207. // Define the cell format
208. times = new WritableCellFormat(times10pt);
209. label = new Label(column, row, s, times);
210. sheet.addCell(label);
211. }
212. public static void main(String[] args) throws Exception {
213. // for(int i=17;i<29;i++){
214. // JXLWriteExcel mergerExcel = new JXLWriteExcel("d:/合并文件/merger_"+i+".xls","D:/scopus20111124/"+i,2);
215. // String inf=mergerExcel.mergerExcel();
216. // System.out.println("第"+i+"批次文件"+inf);
217. // }
218. File source=new File("D://cs//MPOSJLTF_T1_20170103_01.xls");
219. File srcFile=new File("D://cs//MPOSJLTF_T1_20170103.xls");
220.
221. JXLMergerWriteExcelUtil mergerExcel = new JXLMergerWriteExcelUtil("D://cs//MPOSJLTF_T1_20170103.xls","D://cs//MPOSJLTF_T1_20170103_02.xls",1);
222. String inf=mergerExcel.mergerExcel();
223. // mergerExcel.fileChannelCopy(source, srcFile);
224. }
225. }
二. 使用POI工具合并多个后缀为xls与xlsx的excel文件,直接贴上代码。
1. package com.bacs.buz.util;
2. import java.io.File;
3. import java.io.FileInputStream;
4. import java.io.FileNotFoundException;
5. import java.io.FileOutputStream;
6. import java.io.IOException;
7. import java.util.ArrayList;
8. import java.util.List;
9. import org.apache.poi.hssf.usermodel.HSSFFont;
10. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
11. import org.apache.poi.hssf.util.HSSFColor;
12. import org.apache.poi.ss.usermodel.Cell;
13. import org.apache.poi.ss.usermodel.CellStyle;
14. import org.apache.poi.ss.usermodel.Font;
15. import org.apache.poi.ss.usermodel.Row;
16. import org.apache.poi.ss.usermodel.Sheet;
17. import org.apache.poi.ss.usermodel.Workbook;
18. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
19. import com.xingyi.bacs.util.LogUtil;
20. /**
21. * POI合并excel工具类
22. * @author hhb
23. *
24. */
25. public class POIMergeExcelUtil {
26.
27. private List<String> columns=null;//列名集合
28.
29. /**
30. * 创建xls或者xlsx文件
31. * @param filePath
32. * @param sourceSheet 第一份文件的sheet
33. * @throws Exception
34. */
35. public void createExcelFile(String filePath,Sheet sourceSheet) throws Exception{
36. LogUtil.info(POIMergeExcelUtil.class, "开始创建主文件,文件路径为:"+filePath);
37. Workbook workbook = null;
38. File file=new File(filePath);
39. String status=filePath.substring(filePath.lastIndexOf("."));
40. //HSSFWorkbook针对xls
41. if(status.equals(".xls")){
42. workbook = new HSSFWorkbook();
43. }
44. //XSSFWorkbook针对xlsx
45. if(status.equals(".xlsx")){
46. workbook = new XSSFWorkbook();
47. }
48. //创建一个工作簿
49. Sheet sheet=workbook.createSheet();
50. //创建列头
51. Row firstRow=sheet.createRow(0);
52. for(int i=0;i<columns.size();i++){
53. Cell cell=firstRow.createCell(i, Cell.CELL_TYPE_STRING);
54. cell.setCellStyle(getStyle(workbook));
55. cell.setCellValue(columns.get(i));
56. }
57. LogUtil.info(POIMergeExcelUtil.class, "正在将第一份文件内容合并到主文件中……");
58. //将第一份目标文件内容填充到新的文件中
59. for(int i=1;i<sourceSheet.getLastRowNum()+1;i++){
60. Row createRow=sheet.createRow(i);
61. //获取第一份文件的一行
62. Row sourceRow=sourceSheet.getRow(i);
63. for(int j=0;j<columns.size();j++){
64. Cell cell=sourceRow.getCell(j);
65. String cellValue=getCellValue(cell);
66. Cell createCell=createRow.createCell(j);
67. createCell.setCellValue(cellValue);
68. }
69. }
70. FileOutputStream fos=new FileOutputStream(file);
71. workbook.write(fos);
72. fos.flush();
73. fos.close();
74. LogUtil.info(POIMergeExcelUtil.class, "主文件创建成功,文件路径为:"+file.getAbsolutePath());
75. }
76.
77. /**
78. * 获取单元格里面的值
79. * @param cell
80. * @return
81. */
82. public String getCellValue(Cell cell){
83. String cellValue = "";
84. if(cell == null){
85. return cellValue;
86. }
87. //把数字当成String来读,避免出现1读成1.0的情况
88. if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
89. cell.setCellType(Cell.CELL_TYPE_STRING);
90. }
91. //判断数据的类型
92. switch (cell.getCellType()){
93. case Cell.CELL_TYPE_NUMERIC: //数字
94. cellValue = String.valueOf(cell.getNumericCellValue());
95. break;
96. case Cell.CELL_TYPE_STRING: //字符串
97. cellValue = String.valueOf(cell.getStringCellValue());
98. break;
99. case Cell.CELL_TYPE_BOOLEAN: //Boolean
100. cellValue = String.valueOf(cell.getBooleanCellValue());
101. break;
102. case Cell.CELL_TYPE_FORMULA: //公式
103. cellValue = String.valueOf(cell.getCellFormula());
104. break;
105. case Cell.CELL_TYPE_BLANK: //空值
106. cellValue = "";
107. break;
108. case Cell.CELL_TYPE_ERROR: //故障
109. cellValue = "非法字符";
110. break;
111. default:
112. cellValue = "未知类型";
113. break;
114. }
115. return cellValue;
116. }
117.
118. /**
119. * 表格格式
120. * @param workbook
121. * @return
122. */
123. private CellStyle getStyle(Workbook workbook){
124. CellStyle style = workbook.createCellStyle();
125. //style.setAlignment(CellStyle.ALIGN_CENTER);
126. // style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
127. // 设置单元格字体
128. Font headerFont = workbook.createFont(); // 字体
129. headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
130. headerFont.setColor(HSSFColor.BLACK.index);
131. //headerFont.setFontName("宋体");
132. style.setFont(headerFont);
133. //tyle.setWrapText(true);*/
134.
135. return style;
136. }
137. /**
138. * 合并Excel
139. * @param srcPath 目标文件路径
140. * @param sourcePath 需要合并的文件路径
141. * @throws IOException
142. * @throws FileNotFoundException
143. */
144. public void mergeExcel(String srcPath,String sourcePath) throws Exception{
145. File inputWorkbook = new File(srcPath);
146. Workbook w = null;
147. String status=srcPath.substring(srcPath.lastIndexOf("."));
148. //HSSFWorkbook针对xls
149. if(status.equals(".xls")){
150. w = new HSSFWorkbook(new FileInputStream(inputWorkbook));
151. }
152. //XSSFWorkbook针对xlsx
153. if(status.equals(".xlsx")){
154. w = new XSSFWorkbook(new FileInputStream(inputWorkbook));
155. }
156. Sheet sheet = w.getSheetAt(0);
157. this.beginMergerColumn(sheet, sourcePath);
158. FileOutputStream fos=new FileOutputStream(inputWorkbook);
159. w.write(fos);
160. fos.flush();
161. fos.close();
162. LogUtil.info(POIMergeExcelUtil.class, "======Excel文件合并成功=====");
163. }
164.
165. /*****
166. * 开始合并文件
167. * @param excelSheet
168. * @param dirPath
169. * @throws IOException
170. * @throws FileNotFoundException
171. */
172. private void beginMergerColumn(Sheet excelSheet,String dirPath ) throws Exception{
173. File inputWorkbook = new File(dirPath);
174. LogUtil.info(POIMergeExcelUtil.class, "开始合并Excel文件:"+dirPath);
175. Workbook w = null;
176. String status=dirPath.substring(dirPath.lastIndexOf("."));
177. //HSSFWorkbook针对xls
178. if(status.equals(".xls")){
179. w = new HSSFWorkbook(new FileInputStream(inputWorkbook));
180. }
181. //XSSFWorkbook针对xlsx
182. if(status.equals(".xlsx")){
183. w = new XSSFWorkbook(new FileInputStream(inputWorkbook));
184. }
185. //需要合并文件的sheet
186. Sheet sheet = w.getSheetAt(0);
187. //主文件从第几行开始追加内容
188. int mergerRowBeginIndex=excelSheet.getLastRowNum()+1;
189. LogUtil.info(POIMergeExcelUtil.class, "主文件开始合并的行号值为:"+mergerRowBeginIndex);
190. LogUtil.info(POIMergeExcelUtil.class, "需要合并的数量为:"+(sheet.getLastRowNum()));
191. for(int i=1;i<sheet.getLastRowNum()+1;i++){
192. Row createRow=excelSheet.createRow(mergerRowBeginIndex);
193. //获取第一份文件的一行
194. Row sourceRow=sheet.getRow(i);
195. for(int j=0;j<columns.size();j++){
196. Cell cell=sourceRow.getCell(j);
197. String cellValue=getCellValue(cell);
198. Cell createCell=createRow.createCell(j);
199. createCell.setCellValue(cellValue);
200. }
201. mergerRowBeginIndex++;
202. }
203. }
204.
205. /**
206. * 获取列头名称,返回第一份文件的sheet
207. * @param filePath
208. * @throws IOException
209. * @throws FileNotFoundException
210. */
211. public Sheet readFirstFileGetHeaders(String filePath) throws Exception{
212. LogUtil.info(POIMergeExcelUtil.class, "开始获取目标文件的列头,文件路径为:"+filePath);
213. File inputWorkbook = new File(filePath);
214. Workbook w = null;
215. Sheet sheet =null;
216. String status=filePath.substring(filePath.lastIndexOf("."));
217. //HSSFWorkbook针对xls
218. if(status.equals(".xls")){
219. w = new HSSFWorkbook(new FileInputStream(inputWorkbook));
220. }
221. //XSSFWorkbook针对xlsx
222. if(status.equals(".xlsx")){
223. w = new XSSFWorkbook(new FileInputStream(inputWorkbook));
224. }
225. sheet = w.getSheetAt(0);
226. columns=new ArrayList<String>();
227. Row row=sheet.getRow(0);
228. for(int i=0;i<row.getPhysicalNumberOfCells();i++){
229. columns.add(row.getCell(i).toString());
230. }
231. LogUtil.info(POIMergeExcelUtil.class, "结束获取目标文件的列头,列头信息为:"+columns.toString());
232. return sheet;
233. }
234.
235. public static void main(String[] args) throws IOException {
236. POIMergeExcelUtil u=new POIMergeExcelUtil();
237. String srcPath="D://cs//test.xlsx";
238. try {
239. Sheet sheet=u.readFirstFileGetHeaders("D://cs//MPOSJLTF_T1_20170103_01.xls");
240. u.createExcelFile(srcPath,sheet);
241. u.mergeExcel(srcPath, "D://cs//需要合并的文件.xls");
242. } catch (Exception e) {
243. e.printStackTrace();
244. File file=new File(srcPath);
245. if(file.exists()){
246. file.delete();
247. }
248. System.out.println("异常,文件删除");
249. }
250.
251. /* //File file = new File("D://cs//MPOSJLTF_T1_20170104.xlsx");
252. File file = new File("D://cs//test.xlsx");
253. ReadExcel reader = null;
254. //读EXCEL的第一页
255. try {
256. reader = new ReadExcel("D://cs//test.xlsx");
257. reader.processByRow(1);
258. reader.stop();
259. } catch (Exception e) {
260. e.printStackTrace();
261. }
262. //获取读取到的行对象集合
263. List<XRow> xRows = reader.getListXRow();
264. System.out.println(xRows.size());*/
265. }
266. }