1. 程式人生 > >Java實現任意類Excel匯入匯出

Java實現任意類Excel匯入匯出

實際應用中,Excel匯入匯出很常見的操作,例項通過Java反射和註解的機制實現任意類Excel操作。
註解可理解為程式的標記語言,無任何語義,Java虛擬機器不解釋執行該行程式碼。程式設計人員可運用這一特性為特定的方法,屬性,類加上自定義語義,在利用Java的反射機制field.getAnnotation實現自己的邏輯判斷,比如本例項中@Excel註解標記類屬性是否為Excel操作欄位。

package annotate;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import
java.lang.annotation.ElementType; import java.lang.annotation.RetentionPolicy; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) //excel表格註解 public @interface Excel { //欄位excel表頭名稱 public String name() default ""; //欄位是否為必填項 public boolean require() default false; }
package
test; import annotate.Excel; public class Student { @Excel(name="編碼",require=true) private int id; @Excel(name="姓名",require=true) private String name; @Excel(name="性別",require=true) private String sex; @Excel(name="年齡") private int age; private int num; public Student(){ } public Student(int id, String name, String sex, int
age) { this.id = id; this.name = name; this.sex = sex; this.age = age; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]"; } }
package test;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import annotate.Excel;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.NumberFormats;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import unity.SpellHelper;


@SuppressWarnings("unchecked")
public class excel {

    public static void main(String[] args){
        List<Student> students = new ArrayList<Student>();
        for(int i=0;i<10;i++){
            Student student = new Student(i, "測試"+i,i%2==0?"男":"女" , i*10);
            students.add(student);
        }
        out(Student.class,new File("D:\\學生資訊.xls"),students, "學生資訊","紅色為必填項\n編碼為數字\n");
        List<Student> list = (List<Student>)in(new File("D:\\學生資訊.xls"),Student.class);
        //JDK1.8 Lambda表示式
        list.stream().forEach(student -> System.out.println(student.toString()));
    }

    /***
     * 匯入Excel
     * @param file Excel檔案
     * @param classz 例項類
     * @return
     */
    public static Object in(File file,Class<?> classz){
        int i=0,j=0;
        try {
            Workbook rwb=Workbook.getWorkbook(file);
            Sheet rs=rwb.getSheet(0);
            int clos=rs.getColumns();//得到所有的列
            int rows=rs.getRows();//得到所有的行
            Map<String, String> fieldMap = new HashMap<String, String>();
            StringBuffer fieldNames = new StringBuffer("");
            for(Field field: classz.getDeclaredFields()){
                if(field.isAnnotationPresent(Excel.class)){
                    Excel excel = field.getAnnotation(Excel.class);
                    fieldMap.put(excel.name(), field.getName());
                }
            }
            for(j=0;j<clos;j++){
                String name = rs.getCell(j, 0).getContents();
                fieldNames.append(fieldMap.get(name.trim())+",");
            }
            if(fieldNames.length()>1)
                fieldNames.setLength(fieldNames.length()-1);
            String filedNames[] = fieldNames.toString().split(",");
            List<Object> list = new ArrayList<Object>();
            for (i = 1; i < rows; i++) {
                Object entity = classz.newInstance();
                for (j = 0; j < clos; j++) {
                    Field field = classz.getDeclaredField(filedNames[j]);
                    String data = rs.getCell(j, i).getContents().trim();
                    Excel excel = field.getAnnotation(Excel.class);
                    if((null == data || data.isEmpty()) && field.getAnnotation(Excel.class).require())
                        return "第"+(i+1)+"行"+(j+1)+"必填項不能為空值";
                    if("性別".equals(excel.name().trim()) && !("男".equals(data) || "女".equals(data)))
                        return "性別只能為男,女"; 
                    Object object = null;
                    Method method = classz.getMethod("set"+SpellHelper.captureName(filedNames[j]),field.getType());
                    if(null != data && !data.isEmpty()){
                        //單元格資料型別校驗
                        if(field.getType() == int.class || field.getType() == Integer.class)
                            object = Integer.parseInt(data);
                        else if(field.getType() == long.class || field.getType() == Long.class)
                            object = Long.parseLong(data);
                        else if(field.getType() == short.class || field.getType() == Short.class)
                            object = Short.parseShort(data);
                        else if(field.getType() == float.class || field.getType() == Float.class)
                            object = Float.parseFloat(data);
                        else if(field.getType() == double.class || field.getType() == Double.class)
                            object = Double.parseDouble(data);
                        //日期格式校驗
                        else if(filedNames[j].endsWith("date") && excel.require()){
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                            sdf.parse(data);
                            object = data;
                        }
                        else
                            object = data;
                        method.invoke(entity, object);
                    }
                }
                list.add(entity);
            }
            return list;

        } catch (Exception e) {
            e.printStackTrace();
            return "第"+(i+1)+"行"+(j+1)+"列資料格式不正確";
        }
    }

    /***
     * 匯出Excel
     * @param file Excel檔案
     * @param obj 待匯出資料(只支援列表或實體)
     * @param sheetName(Excel表Sheet名稱)
     * @param 格式說明
     */
    public static void out(Class<?> clazz,File file,Object obj,String sheetName,String str_intro){
        try {
            List<Object> list;
            //傳入物件是否為列表
            if(obj instanceof List){
                list = (List<Object>)obj;
            }
            else{
                list = new ArrayList<Object>();
                list.add(obj);
            }
            if (!file.exists()) {
                file.getParentFile().mkdirs();
                file.createNewFile();
            }
            WritableWorkbook wwb = Workbook.createWorkbook(file);
            //建立工作表
            WritableSheet ws = wwb.createSheet(sheetName, 0);
            //Excel字型樣式
            WritableFont blackFont = new WritableFont(WritableFont.ARIAL,12,WritableFont.NO_BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.BLACK);  
            WritableFont redFont = new WritableFont(WritableFont.ARIAL,12,WritableFont.NO_BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.RED);  
            //設定為文字格式
            WritableCellFormat blackFormat = new WritableCellFormat(NumberFormats.TEXT);
            WritableCellFormat redFormat = new WritableCellFormat(NumberFormats.TEXT);
            blackFormat.setFont(blackFont);
            redFormat.setFont(redFont);
            Field[] fields = clazz.getDeclaredFields();
            //註解@excel屬性集合
            StringBuffer fileNames = new StringBuffer();
            //Excel預設行寬高
            ws.getSettings().setDefaultColumnWidth(15);
            ws.getSettings().setDefaultRowHeight(300);
            //寫入表頭資訊
            int col=0;
            for(Field field : fields){
                if (field.isAnnotationPresent(Excel.class)) {  
                    Excel excel = field.getAnnotation(Excel.class);
                    fileNames.append("get"+SpellHelper.captureName(field.getName())+",");
                    ws.addCell(new Label(col++,0,excel.name(),excel.require()?redFormat:blackFormat));
                }  
            }
            //寫入元資料
            for(int i=0;i<list.size();i++){
                setCell(ws,blackFormat,i+1,list.get(i),fileNames.toString().split(","));
            }
            //格式說明表
            WritableSheet intro = wwb.createSheet("格式說明", 1);
            //合併單元格
            intro.mergeCells(0, 0, 20, 20);
            WritableFont introFont = new WritableFont(WritableFont.ARIAL,14,WritableFont.NO_BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.RED);  
            WritableCellFormat introFormat = new WritableCellFormat(introFont);  
            //自動換行
            introFormat.setWrap(true);
            //頂部對齊
            introFormat.setVerticalAlignment(VerticalAlignment.TOP);
            //提示資訊
            intro.addCell(new Label(0, 0, str_intro, introFormat));
            wwb.write();
            wwb.close();
        } catch (Exception e) {
            e.printStackTrace();
            // TODO: handle exception
        }

    }

    /***
     * 初始化excel單元格內容
     * @param ws Excel單元頁Sheet名稱
     * @param row 單元格行號
     * @param obj 待寫入物件
     * @param fieldName 待寫入物件屬性名稱集合
     */
    private static void setCell(WritableSheet ws,WritableCellFormat format,int row,Object obj,String[] fieldName){
        try {
            for(int i=0;i<fieldName.length;i++){
                if(!fieldName[i].isEmpty()){
                    Method method = obj.getClass().getMethod(fieldName[i], new Class[]{});
                    Object value = method.invoke(obj, new Object[]{});
                    ws.addCell(new Label(i,row,value==null?"":String.valueOf(value),format));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            // TODO: handle exception
        }
    }
}

相關推薦

Java實現任意Excel匯入匯出

實際應用中,Excel匯入匯出很常見的操作,例項通過Java反射和註解的機制實現任意類Excel操作。 註解可理解為程式的標記語言,無任何語義,Java虛擬機器不解釋執行該行程式碼。程式設計人員可運用這一特性為特定的方法,屬性,類加上自定義語義,在利用Java

Java 實現Excel匯入匯出(包含一些簡單樣式設定)工具

最近很奇怪,客戶各種各樣奇葩的需求,匯出個表格設計各種樣式,真心無語,網上找了很多資料,新手就是這麼坑爹,找東西都不能有點速度!沒辦法,水平所致。提供給跟我差不多水平的朋友參考。 package com.cicro.fuchen.util.excel;

Java操作Excel匯入匯出萬能工具

更新日誌:(程式碼隨時更新、優化、修復bug、也歡迎您私信我) * 更新日誌: * 1.response.reset();註釋掉reset,否在會出現跨域錯誤。 * 2.新增匯出多個單表格。 * 3.

一個基於POI的通用excel匯入匯出工具的簡單實現及使用方法

前言: 最近PM來了一個需求,簡單來說就是在錄入資料時一條一條插入到系統顯得非常麻煩,讓我實現一個直接通過excel匯入的方法一次性錄入所有資料。網上關於excel匯入匯出的例子很多,但大多相互借鑑。經過思考,認為一百個客戶在錄入excel的時候,就會有一百個格式版本,所以在實現這個功能之前,所以要統一exc

java利用POI實現Excel匯入匯出詳解-支援97-2013版本以及2017版本

package com.kero99.ygc.excel; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.apache.

實現一個配置簡單功能強大的excel工具搞定excel匯入匯出(二)

上篇文章留了個小懸念,您是否有這樣的需求呢: 1.實體類中存放的值是一個編碼,而匯出的檔案中需要把編碼轉成有意義的文字.例如:實體類中性別用0,1表示,而希望匯出的excel檔案中是"男","女". 2.想對匯入的內容加一些邏輯,例如:判斷某些值不能為空.或判斷年齡不能小於

JAVA實現Excel匯入匯出

JXL實現Excel的Excel匯入匯出 JXL實現Excel的建立 JXL建立Excel檔案 /** * JXL建立Excel檔案 * @author c * */ publ

Elasticsearch 資料匯入匯出 Java 實現工具

Elasticsearch 資料匯入匯出 Java 實現 最近學了elasticsearch 對它也不是非常的熟悉,它好像沒有像 mongodb 有mongodump 這樣的工具方便。 雖然也有一些別人做的外掛工具。但嫌麻煩,所以整理了網上一些大神寫

springboot2整合easypoi,實現Excel匯入匯出

1.新增Maven依賴 <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <v

JAVAExcel匯入匯出詳解(3)--匯出

Excel匯出 一、設定查詢條件 注意:無法通過Ajax下載 jsp程式碼 <form class="col-sm-2" action="/manage/order/download" method="post" onsubmit="checkForm()"

JAVAExcel匯入匯出詳解(2)--匯入

1. 瀏覽資料夾,選擇需要上傳的檔案 程式碼 jsp <li class="col-sm-1"> <span>上&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&a

POI-Excel匯入匯出 詳細實現程式碼

1.介面效果:                   1)點選批量匯入,彈出檔案選擇框,選擇檔案,點選開啟,檔案開始上傳。           &nb

Spring使用POI實現Excel匯入匯出

Apache POI 是建立和維護操作各種符合Office Open XML(OOXML)標準和微軟的OLE 2複合文件格式(OLE2)的Java API。用它可以使用Java讀取和建立,修改MS Excel檔案.而且,還可以使用Java讀取和建立MS Word和MSPowerPoint檔案。Ap

java實現簡單的poi匯入excel

示例程式碼 public void poiTest(){ File file = new File("xxx\\test.xlsx") ; InputStream input = new FileInputStream(file) ; String fileName =

Java POI大資料量的Excel匯入匯出

  1. 大資料量的匯入 當Excel中的資料量超過10萬行時,在用POI讀取檔案流時很容易引起失敗,需要引入xlsx-streamer來進行資源的開啟,剩下的處理同POI處理上百行資料量類似:filePath=>FileInputStream=>Workboo

Java通過Poi的開發Excel匯入匯出和下載功能

原文連結:http://www.zjhuiwan.cn/toDetail?articleId=1812131133133410000 最近有用到Excel的下載、匯入、匯出功能。提供一個Excel模板給使用者下載,使用者根據規範填寫模板然後再匯入Excel資料,儲存到資料庫,也可匯出類表資料

easypoi Excel匯入匯出 (工具

1.用到的jar 紅色的必須的。 下面那些是執行起來,缺哪個就導哪個。 如果報錯提示沒有這個方法的話,重啟Tomcat,還不好使就是jar包版本不對,找個高點的版本。  easypoi-annotation-3.1.0.jar easypoi-base-3.1.0.j

POI實現Excel匯入匯出(轉)

利用idea建立java web的maven專案,在pom中新增對poi的jar的依賴。 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/200

jxl實現excel匯入匯出的完整demo

@RequestMapping("/pointsImport.do") public void StructureImport(HttpServletRequest request, HttpServletResponse response, Long driv

Java後臺程式碼實現POI檔案的匯入匯出

前言 工作中常常會用到POI的匯入匯出功能,今天為大家詳細介紹一下平時用到的最多的匯入Excel表格資料和匯出資料為Excel表格的相關程式碼操作!本案例是SpringBoot專案,廢話不多說上程式碼! 1.Controller層程式碼 //相關導包 import