POI-Excel表格导入和导出

ExcelWriter

  1 /**
  2  * @author zuzhilong
  3  * @date 2013-10-10 下午08:04:02
  4  * @desc 生成导出Excel文件对象
  5  * @modify 
  6  * @version 1.0.0
  7  */
  8 package com.haoyisheng.util;
  9 
 10 import java.io.File;
 11 import java.io.FileNotFoundException;
 12 import java.io.FileOutputStream;
 13 import java.io.IOException;
 14 import java.io.OutputStream;
 15 import java.util.Calendar;
 16 
 17 import org.apache.poi.hssf.usermodel.HSSFCell;
 18 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
 19 import org.apache.poi.hssf.usermodel.HSSFDataFormat;
 20 import org.apache.poi.hssf.usermodel.HSSFRow;
 21 import org.apache.poi.hssf.usermodel.HSSFSheet;
 22 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 23 
 24 public class ExcelWriter {
 25     // 设置cell编码解决中文高位字节截断
 26     private static short XLS_ENCODING = HSSFCell.ENCODING_UTF_16;
 27 
 28     // 定制浮点数格式
 29     private static String NUMBER_FORMAT = "#,##0.00";
 30 
 31     // 定制日期格式
 32     private static String DATE_FORMAT = "m/d/yy"; // "m/d/yy h:mm"
 33 
 34     private OutputStream out = null;
 35 
 36     private HSSFWorkbook workbook = null;
 37 
 38     private HSSFSheet sheet = null;
 39 
 40     private HSSFRow row = null;
 41 
 42     public ExcelWriter() {
 43     }
 44 
 45     /**
 46      * 初始化Excel
 47      * 
 48      */
 49     public ExcelWriter(OutputStream out) {
 50         this.out = out;
 51         this.workbook = new HSSFWorkbook();
 52         this.sheet = workbook.createSheet();
 53     }
 54 
 55     /**
 56      * 导出Excel文件
 57      * 
 58      * @throws IOException
 59      */
 60     public void export() throws FileNotFoundException, IOException {
 61         try {
 62             workbook.write(out);
 63             out.flush();
 64             out.close();
 65         } catch (FileNotFoundException e) {
 66             throw new IOException(" 生成导出Excel文件出错! ", e);
 67         } catch (IOException e) {
 68             throw new IOException(" 写入Excel文件出错! ", e);
 69         }
 70 
 71     }
 72 
 73     /**
 74      * 增加一行
 75      * 
 76      * @param index
 77      *            行号
 78      */
 79     public void createRow(int index) {
 80         this.row = this.sheet.createRow(index);
 81     }
 82 
 83     /**
 84      * 获取单元格的值
 85      * 
 86      * @param index
 87      *            列号
 88      */
 89     public String getCell(int index) {
 90         HSSFCell cell = this.row.getCell((short) index);
 91         String strExcelCell = "";
 92         if (cell != null) { // add this condition
 93             // judge
 94             switch (cell.getCellType()) {
 95             case HSSFCell.CELL_TYPE_FORMULA:
 96                 strExcelCell = "FORMULA ";
 97                 break;
 98             case HSSFCell.CELL_TYPE_NUMERIC: {
 99                 strExcelCell = String.valueOf(cell.getNumericCellValue());
100             }
101             break;
102             case HSSFCell.CELL_TYPE_STRING:
103                 strExcelCell = cell.getStringCellValue();
104                 break;
105             case HSSFCell.CELL_TYPE_BLANK:
106                 strExcelCell = "";
107                 break;
108             default:
109                 strExcelCell = "";
110                 break;
111             }
112         }
113         return strExcelCell;
114     }
115 
116     /**
117      * 设置单元格
118      * 
119      * @param index
120      *            列号
121      * @param value
122      *            单元格填充值
123      */
124     public void setCell(int index, int value) {
125         HSSFCell cell = this.row.createCell((short) index);
126         cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
127         cell.setCellValue(value);
128     }
129 
130     /**
131      * 设置单元格
132      * 
133      * @param index
134      *            列号
135      * @param value
136      *            单元格填充值
137      */
138     public void setCell(int index, double value) {
139         HSSFCell cell = this.row.createCell((short) index);
140         cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
141         cell.setCellValue(value);
142         HSSFCellStyle cellStyle = workbook.createCellStyle(); // 建立新的cell样式
143         HSSFDataFormat format = workbook.createDataFormat();
144         cellStyle.setDataFormat(format.getFormat(NUMBER_FORMAT)); // 设置cell样式为定制的浮点数格式
145         cell.setCellStyle(cellStyle); // 设置该cell浮点数的显示格式
146     }
147 
148     /**
149      * 设置单元格
150      * 
151      * @param index
152      *            列号
153      * @param value
154      *            单元格填充值
155      */
156     public void setCell(int index, String value) {
157         HSSFCell cell = this.row.createCell((short) index);
158         cell.setCellType(HSSFCell.CELL_TYPE_STRING);
159 //        cell.setEncoding(XLS_ENCODING);
160         cell.setCellValue(value);
161     }
162 
163     /**
164      * 设置单元格
165      * 
166      * @param index
167      *            列号
168      * @param value
169      *            单元格填充值
170      */
171     public void setCell(int index, Calendar value) {
172         HSSFCell cell = this.row.createCell((short) index);
173 //        cell.setEncoding(XLS_ENCODING);
174         cell.setCellValue(value.getTime());
175         HSSFCellStyle cellStyle = workbook.createCellStyle(); // 建立新的cell样式
176         cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(DATE_FORMAT)); // 设置cell样式为定制的日期格式
177         cell.setCellStyle(cellStyle); // 设置该cell日期的显示格式
178     }
179 
180     public static void main(String[] args) {
181         System.out.println(" 开始导出Excel文件 ");
182 
183         File f = new File("d:\qt.xls");
184         ExcelWriter e = new ExcelWriter();
185 
186         try {
187             e = new ExcelWriter(new FileOutputStream(f));
188         } catch (FileNotFoundException e1) {
189             e1.printStackTrace();
190         }
191 
192         e.createRow(0);
193         e.setCell(0, "试题编码 ");
194         e.setCell(1, "题型");
195         e.setCell(2, "分值");
196         e.setCell(3, "难度");
197         e.setCell(4, "级别");
198         e.setCell(5, "知识点");
199 
200         e.createRow(1);
201         e.setCell(0, "t1");
202         e.setCell(1, 1);
203         e.setCell(2, 3.0);
204         e.setCell(3, 1);
205         e.setCell(4, "重要");
206         e.setCell(5, "专业");
207 
208         try {
209             e.export();
210             System.out.println(" 导出Excel文件[成功] ");
211         } catch (IOException ex) {
212             System.out.println(" 导出Excel文件[失败] ");
213             ex.printStackTrace();
214         }
215     }
216 
217 }

ExcelReader

  1 /**
  2  * @author zuzhilong
  3  * @date 2013-10-10 下午08:02:22
  4  * @desc 读取xls工具类
  5  * @modify 
  6  * @version 1.0.0
  7  */
  8 package com.haoyisheng.util;
  9 
 10 import java.io.File;
 11 import java.io.FileInputStream;
 12 import java.io.IOException;
 13 import java.text.DecimalFormat;
 14 import java.text.SimpleDateFormat;
 15 import java.util.Date;
 16 
 17 import org.apache.poi.hssf.usermodel.HSSFCell;
 18 import org.apache.poi.hssf.usermodel.HSSFDataFormat;
 19 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 20 import org.apache.poi.hssf.usermodel.HSSFRow;
 21 import org.apache.poi.hssf.usermodel.HSSFSheet;
 22 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 23 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 24 import org.apache.poi.ss.usermodel.CellStyle;
 25 
 26 public class ExcelReader {
 27     // 工作薄,也就是一个excel文件
 28     private HSSFWorkbook wb = null;// book [includes sheet]
 29     //一个excle文件可以有多个sheet
 30     private HSSFSheet sheet = null;
 31     // 代表了表的第一行,也就是列名
 32     private HSSFRow row = null;
 33     // 一个excel有多个sheet,这是其中一个
 34     private int sheetNum = 0; // 第sheetnum个工作表
 35     // 一个sheet中可以有多行,这里应该是给行数的定义
 36     private int rowNum = 0;
 37     // 文件输入流
 38     private FileInputStream fis = null;
 39     // 指定文件
 40     private File file = null;
 41 
 42     public ExcelReader() {
 43     }
 44 
 45     public ExcelReader(File file) {
 46         this.file = file;
 47     }
 48 
 49     public void setRowNum(int rowNum) {
 50         this.rowNum = rowNum;
 51     }
 52 
 53     public void setSheetNum(int sheetNum) {
 54         this.sheetNum = sheetNum;
 55     }
 56 
 57     public void setFile(File file) {
 58         this.file = file;
 59     }
 60 
 61     /**
 62      * 读取excel文件获得HSSFWorkbook对象
 63      */
 64     public void open() throws IOException {
 65         fis = new FileInputStream(file);
 66         wb = new HSSFWorkbook(new POIFSFileSystem(fis));
 67         fis.close();
 68     }
 69 
 70     /**
 71      * 返回sheet表数目
 72      * 
 73      * @return int
 74      */
 75     public int getSheetCount() {
 76         int sheetCount = -1;
 77         sheetCount = wb.getNumberOfSheets();
 78         return sheetCount;
 79     }
 80 
 81     /**
 82      * sheetNum下的记录行数
 83      * 
 84      * @return int
 85      */
 86     public int getRowCount() {
 87         if (wb == null)
 88             System.out.println("=============>WorkBook为空");
 89         HSSFSheet sheet = wb.getSheetAt(this.sheetNum);
 90         int rowCount = -1;
 91         rowCount = sheet.getLastRowNum();
 92         return rowCount;
 93     }
 94 
 95     /**
 96      * 读取指定sheetNum的rowCount
 97      * 
 98      * @param sheetNum
 99      * @return int
100      */
101     public int getRowCount(int sheetNum) {
102         HSSFSheet sheet = wb.getSheetAt(sheetNum);
103         int rowCount = -1;
104         rowCount = sheet.getLastRowNum();
105         return rowCount;
106     }
107 
108     /**
109      * 得到指定行的内容
110      * 
111      * @param lineNum
112      * @return String[]
113      */
114     public String[] readExcelLine(int lineNum) {
115         return readExcelLine(this.sheetNum, lineNum);
116     }
117 
118     /**
119      * 指定工作表和行数的内容
120      * 
121      * @param sheetNum
122      * @param lineNum
123      * @return String[]
124      */
125     public String[] readExcelLine(int sheetNum, int lineNum) {
126         if (sheetNum < 0 || lineNum < 0)
127             return null;
128         String[] strExcelLine = null;
129         try {
130             sheet = wb.getSheetAt(sheetNum);
131             row = sheet.getRow(lineNum);
132 
133             int cellCount = row.getLastCellNum();
134             strExcelLine = new String[cellCount + 1];
135             for (int i = 0; i <= cellCount; i++) {
136                 strExcelLine[i] = readStringExcelCell(lineNum, i);
137             }
138         } catch (Exception e) {
139             e.printStackTrace();
140         }
141         return strExcelLine;
142     }
143 
144     /**
145      * 读取指定列的内容
146      * 
147      * @param cellNum
148      * @return String
149      */
150     public String readStringExcelCell(int cellNum) {
151         return readStringExcelCell(this.rowNum, cellNum);
152     }
153 
154     /**
155      * 指定行和列编号的内容
156      * 
157      * @param rowNum
158      * @param cellNum
159      * @return String
160      */
161     public String readStringExcelCell(int rowNum, int cellNum) {
162         return readStringExcelCell(this.sheetNum, rowNum, cellNum);
163     }
164 
165     /**
166      * 指定工作表、行、列下的内容
167      * 
168      * @param sheetNum
169      * @param rowNum
170      * @param cellNum
171      * @return String
172      */
173     public String readStringExcelCell(int sheetNum, int rowNum, int cellNum) {
174         if (sheetNum < 0 || rowNum < 0)
175             return "";
176         String strExcelCell = "";
177         try {
178             sheet = wb.getSheetAt(sheetNum);
179             row = sheet.getRow(rowNum);
180 
181             if (row.getCell((short) cellNum) != null) { // add this condition
182                 // judge
183                 switch (row.getCell((short) cellNum).getCellType()) {
184                 case HSSFCell.CELL_TYPE_FORMULA:
185                     strExcelCell = "FORMULA ";
186                     break;
187                 case HSSFCell.CELL_TYPE_NUMERIC: {
188                     if (HSSFDateUtil.isCellDateFormatted(row.getCell((short) cellNum))) {// 处理日期格式、时间格式   
189                         SimpleDateFormat sdf = null;   
190                         if (row.getCell((short) cellNum).getCellStyle().getDataFormat() == HSSFDataFormat   
191                                 .getBuiltinFormat("h:mm")) {   
192                             sdf = new SimpleDateFormat("HH:mm");   
193                         } else {// 日期   
194                             sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   
195                         }   
196                         Date date = row.getCell((short) cellNum).getDateCellValue();   
197                         strExcelCell = sdf.format(date);   
198                     } else if (row.getCell((short) cellNum).getCellStyle().getDataFormat() == 58) {   
199                         // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)   
200                         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   
201                         double value = row.getCell((short) cellNum).getNumericCellValue();   
202                         Date date = org.apache.poi.ss.usermodel.DateUtil   
203                         .getJavaDate(value);   
204                         strExcelCell = sdf.format(date);   
205                     } else {   
206                         double value = row.getCell((short) cellNum).getNumericCellValue();   
207                         CellStyle style = row.getCell((short) cellNum).getCellStyle();   
208                         DecimalFormat format = new DecimalFormat("0.0");   
209                         String temp = style.getDataFormatString();   
210                         // 单元格设置成常规   
211                         if (temp.equals("General")) {   
212                             format.applyPattern("#.#");   
213                         }   
214                         strExcelCell = format.format(value);   
215                     }
216                 }
217                 break;
218                 case HSSFCell.CELL_TYPE_STRING:
219                     strExcelCell = row.getCell((short) cellNum)
220                     .getStringCellValue();
221                     break;
222                 case HSSFCell.CELL_TYPE_BLANK:
223                     strExcelCell = "";
224                     break;
225                 default:
226                     strExcelCell = "";
227                     break;
228                 }
229             }
230         } catch (Exception e) {
231             e.printStackTrace();
232         }
233         return strExcelCell;
234     }
235 
236     public static void main(String args[]) {
237         File file = new File("d:\无锡妇幼保健人员对应培训项目确认表(返).xls");
238         ExcelReader readExcel = new ExcelReader(file);
239         try {
240             readExcel.open();
241         } catch (IOException e) {
242             e.printStackTrace();
243         }
244         readExcel.setSheetNum(0); // 设置读取索引为0的工作表
245         // 总行数
246         int count = readExcel.getRowCount();
247         for (int i = 0; i <= count; i++) {
248             String[] rows = readExcel.readExcelLine(i);
249             for (int j = 0; j < rows.length; j++) {
250                 System.out.print(rows[j] + " ");
251             }
252             System.out.print("
");
253         }
254     }
255 }
原文地址:https://www.cnblogs.com/sharpest/p/5660268.html