zoukankan      html  css  js  c++  java
  • java项目中Excel文件的导入导出

      1 package poi.excel;
      2 
      3 import java.io.IOException;
      4 import java.io.InputStream;
      5 import java.io.OutputStream;
      6 import java.lang.reflect.Field;
      7 import java.lang.reflect.Method;
      8 import java.util.ArrayList;
      9 import java.util.List;
     10 
     11 import javax.servlet.http.HttpServletRequest;
     12 
     13 import org.apache.log4j.Logger;
     14 import org.apache.poi.hssf.usermodel.HSSFCell;
     15 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
     16 import org.apache.poi.hssf.usermodel.HSSFFont;
     17 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
     18 import org.apache.poi.hssf.usermodel.HSSFRow;
     19 import org.apache.poi.hssf.usermodel.HSSFSheet;
     20 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
     21 import org.apache.poi.hssf.util.HSSFColor;
     22 import org.apache.poi.ss.usermodel.Cell;
     23 import org.apache.poi.ss.usermodel.Row;
     24 import org.apache.poi.ss.usermodel.Sheet;
     25 import org.apache.poi.ss.usermodel.Workbook;
     26 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
     27 
     28 
     29 
     30 /** 
     31 * @ClassName: ExcelUtil 
     32 * @Description: Excel导入导出工具类
     33 * @author 周宣
     34 * @date 2016-11-8 下午7:16:11 
     35 *  
     36 */
     37 public class ExcelUtil {
     38     private static final Logger logger = Logger.getLogger(ExcelUtil.class);
     39     
     40     /** 
     41     * @Title: createWorkbook 
     42     * @Description: 判断excel文件后缀名,生成不同的workbook 
     43     * @param @param is
     44     * @param @param excelFileName
     45     * @param @return
     46     * @param @throws IOException
     47     * @return Workbook
     48     * @throws 
     49     */
     50     public Workbook createWorkbook(InputStream is,String excelFileName) throws IOException{
     51         if (excelFileName.endsWith(".xls")) {
     52             return new HSSFWorkbook(is);
     53         }else if (excelFileName.endsWith(".xlsx")) {
     54             return new XSSFWorkbook(is);
     55         }
     56         return null;
     57     }
     58 
     59     /** 
     60     * @Title: getSheet 
     61     * @Description: 根据sheet索引号获取对应的sheet
     62     * @param @param workbook
     63     * @param @param sheetIndex
     64     * @param @return
     65     * @return Sheet
     66     * @throws 
     67     */
     68     public Sheet getSheet(Workbook workbook,int sheetIndex){
     69         return workbook.getSheetAt(0);        
     70     }
     71     
     72     /** 
     73     * @Title: importDataFromExcel 
     74     * @Description: 将sheet中的数据保存到list中,
     75     * 1、调用此方法时,vo的属性个数必须和excel文件每行数据的列数相同且一一对应,vo的所有属性都为String
     76     * 2、在action调用此方法时,需声明 
     77     *     private File excelFile;上传的文件
     78     *     private String excelFileName;原始文件的文件名
     79     * 3、页面的file控件name需对应File的文件名
     80     * @param @param vo javaBean
     81     * @param @param is 输入流
     82     * @param @param excelFileName
     83     * @param @return
     84     * @return List<Object>
     85     * @throws 
     86     */
     87     public List<Object> importDataFromExcel(Object vo,InputStream is,String excelFileName){
     88         List<Object> list = new ArrayList<Object>();
     89         try {
     90             //创建工作簿
     91             Workbook workbook = this.createWorkbook(is, excelFileName);
     92             //创建工作表sheet
     93             Sheet sheet = this.getSheet(workbook, 0);
     94             //获取sheet中数据的行数
     95             int rows = sheet.getPhysicalNumberOfRows();
     96             //获取表头单元格个数
     97             int cells = sheet.getRow(0).getPhysicalNumberOfCells();
     98             //利用反射,给JavaBean的属性进行赋值
     99             Field[] fields = vo.getClass().getDeclaredFields();
    100             for (int i = 1; i < rows; i++) {//第一行为标题栏,从第二行开始取数据
    101                 Row row = sheet.getRow(i);
    102                 int index = 0;
    103                 while (index < cells) {
    104                     Cell cell = row.getCell(index);
    105                     if (null == cell) {
    106                         cell = row.createCell(index);
    107                     }
    108                     cell.setCellType(Cell.CELL_TYPE_STRING);
    109                     String value = null == cell.getStringCellValue()?"":cell.getStringCellValue();
    110                     
    111                     Field field = fields[index];
    112                     String fieldName = field.getName();
    113                     String methodName = "set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
    114                     Method setMethod = vo.getClass().getMethod(methodName, new Class[]{String.class});
    115                     setMethod.invoke(vo, new Object[]{value});
    116                     index++;
    117                 }
    118                 if (isHasValues(vo)) {//判断对象属性是否有值
    119                     list.add(vo);
    120                     vo.getClass().getConstructor(new Class[]{}).newInstance(new Object[]{});//重新创建一个vo对象
    121                 }
    122                 
    123             }
    124         } catch (Exception e) {
    125             logger.error(e);
    126         }finally{
    127             try {
    128                 is.close();//关闭流
    129             } catch (Exception e2) {
    130                 logger.error(e2);
    131             }
    132         }
    133         return list;
    134         
    135     }
    136     
    137     /** 
    138     * @Title: isHasValues 
    139     * @Description: 判断一个对象所有属性是否有值,如果一个属性有值(分空),则返回true
    140     * @param @param object
    141     * @param @return
    142     * @return boolean
    143     * @throws 
    144     */
    145     public boolean isHasValues(Object object){
    146         Field[] fields = object.getClass().getDeclaredFields();
    147         boolean flag = false;
    148         for (int i = 0; i < fields.length; i++) {
    149             String fieldName = fields[i].getName();
    150             String methodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
    151             Method getMethod;
    152             try {
    153                 getMethod = object.getClass().getMethod(methodName);
    154                 Object obj = getMethod.invoke(object);
    155                 if (null != obj && "".equals(obj)) {
    156                     flag = true;
    157                     break;
    158                 }
    159             } catch (Exception e) {
    160                 logger.error(e);
    161             }
    162             
    163         }
    164         return flag;
    165         
    166     }
    167     
    168     public <T> void exportDataToExcel(List<T> list,String[] headers,String title,OutputStream os){
    169         HSSFWorkbook workbook = new HSSFWorkbook();
    170         //生成一个表格
    171         HSSFSheet sheet = workbook.createSheet(title);
    172         //设置表格默认列宽15个字节
    173         sheet.setDefaultColumnWidth(15);
    174         //生成一个样式
    175         HSSFCellStyle style = this.getCellStyle(workbook);
    176         //生成一个字体
    177         HSSFFont font = this.getFont(workbook);
    178         //把字体应用到当前样式
    179         style.setFont(font);
    180         
    181         //生成表格标题
    182         HSSFRow row = sheet.createRow(0);
    183         row.setHeight((short)300);
    184         HSSFCell cell = null;
    185         
    186         for (int i = 0; i < headers.length; i++) {        
    187             cell = row.createCell(i);
    188             cell.setCellStyle(style);
    189             HSSFRichTextString text = new HSSFRichTextString(headers[i]);
    190             cell.setCellValue(text);
    191         }
    192         
    193         //将数据放入sheet中
    194         for (int i = 0; i < list.size(); i++) {
    195             row = sheet.createRow(i+1);
    196             T t = list.get(i);
    197             //利用反射,根据JavaBean属性的先后顺序,动态调用get方法得到属性的值
    198             Field[] fields = t.getClass().getFields();
    199             try {
    200                 for (int j = 0; j < fields.length; j++) {
    201                     cell = row.createCell(j);
    202                     Field field = fields[j];
    203                     String fieldName = field.getName();
    204                     String methodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
    205                     Method getMethod = t.getClass().getMethod(methodName,new Class[]{});
    206                     Object value = getMethod.invoke(t, new Object[]{});
    207                     
    208                     if(null == value)
    209                         value ="";
    210                     cell.setCellValue(value.toString());
    211                     
    212                 }
    213             } catch (Exception e) {
    214                 logger.error(e);
    215             }
    216         }
    217         
    218         try {
    219             workbook.write(os);
    220         } catch (Exception e) {
    221             logger.error(e);
    222         }finally{
    223             try {
    224                 os.flush();
    225                 os.close();
    226             } catch (IOException e) {
    227                 logger.error(e);
    228             }
    229         }
    230         
    231     }
    232     
    233     /** 
    234     * @Title: getCellStyle 
    235     * @Description: 获取单元格格式
    236     * @param @param workbook
    237     * @param @return
    238     * @return HSSFCellStyle
    239     * @throws 
    240     */
    241     public HSSFCellStyle getCellStyle(HSSFWorkbook workbook){
    242         HSSFCellStyle style = workbook.createCellStyle();
    243         style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
    244         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    245         style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
    246         style.setBorderTop(HSSFCellStyle.BORDER_THIN);
    247         style.setLeftBorderColor(HSSFCellStyle.BORDER_THIN);
    248         style.setRightBorderColor(HSSFCellStyle.BORDER_THIN);
    249         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    250         
    251         return style;
    252     }
    253 
    254     /** 
    255     * @Title: getFont 
    256     * @Description: 生成字体样式
    257     * @param @param workbook
    258     * @param @return
    259     * @return HSSFFont
    260     * @throws 
    261     */
    262     public HSSFFont getFont(HSSFWorkbook workbook){
    263         HSSFFont font = workbook.createFont();
    264         font.setColor(HSSFColor.WHITE.index);
    265         font.setFontHeightInPoints((short)12);
    266         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    267         return font;
    268     }
    269     
    270     public boolean isIE(HttpServletRequest request){
    271         return request.getHeader("USER-AGENT").toLowerCase().indexOf("msie")>0?true:false;    
    272     }
    273 }
  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/zhouxuan323/p/6044796.html
Copyright © 2011-2022 走看看