자바 패 키 징 을 상세 하 게 해석 하여 엑셀 작성 표 읽 기와 쓰기 작업 을 실현 합 니 다.

13298 단어 자바Excel
엑셀 에 대한 읽 기와 쓰기 작업 은 생산 환경 에서 흔히 볼 수 있 는 업무 로 인터넷 검색 의 실현 방식 은 모두 POI 와 JXL 제3자 프레임 워 크 를 바탕 으로 하지만 전면적 이지 않다.소 편 은 이틀 동안 마침 필요 하기 때문에 손 으로 쓴 패 키 징 작업 도 구 를 참고 하여 대체적으로 엑셀 표(표 머리 와 표 머리 없 음)의 생 성 을 포함 하고 읽 기와 쓰기 작업 을 한다.여러분 의 편 의 를 위해 필요 한 사람 은 문 서 를 클릭 한 후에 다운 로드 를 풀 고 직접 사용 할 수 있 습 니 다.물론 자신의 수요 에 따라 하 나 를 보면 열 을 알 수 있 고 똑똑 한 당신 에 게 도 어 려 운 일이 아니 라 고 믿 습 니 다.말 이 많 지 않 으 면,바로 원본 을 붙인다.
pom.xml 파일:

<properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <maven.compiler.source>1.8</maven.compiler.source>
 <maven.compiler.target>1.8</maven.compiler.target>
 </properties>

 <dependencies>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
 </dependency>
 <dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.17</version>
 </dependency>
 <dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.0</version>
  <scope>provided</scope>
 </dependency>
 <dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.8.0-beta2</version>
  <scope>test</scope>
 </dependency>
 <dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
 </dependency>
 <dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.8.0-beta2</version>
 </dependency>
 </dependencies>
건축 표 도구 류:ExcelBuider.java

/**
   *      
   * @author Sherman
   * email:[email protected]
   * created in 2018/8/24
   */
  @Slf4j
  public class ExcelBuilder {

   private static HSSFSheet sheet;
   private static HSSFWorkbook wb;
   private static boolean hasHeader;

   /**
    *    
    * @param excellName   
    */
   public ExcelBuilder(String excellName) {
    wb = new HSSFWorkbook();
    sheet = wb.createSheet(excellName);
   }

   /**
    *     ,      
    * @param value      ,        
    *
    */
   public ExcelBuilder header(String... value) {
    if (value != null && value.length != 0) {
     //      
     HSSFCellStyle cellStyle = wb.createCellStyle();
     cellStyle.setFont(font("  ", true, 12));
     HSSFRow row = sheet.createRow(0);
     for (int i = 0; i < value.length; i++) {
      HSSFCell cell = row.createCell(i);
      cell.setCellValue(value[i]);
      cell.setCellStyle(cellStyle);
     }
     hasHeader = true;
    }
    return this;
 }

 /**
  * excel      
  * @param content             
  * @return
  */
 public ExcelBuilder content(List<List<Object>> content) {
  if (content != null && !content.isEmpty()) {
   int index;
   for (int i = 0; i < content.size(); i++) {
    index = hasHeader == false ? i : i + 1;
    HSSFRow row = sheet.createRow(index);
    for (int j = 0; j < content.get(i).size(); j++) {
     String r = "";
     Object value = content.get(i).get(j);
     //        
     if (value instanceof String) {
      r = (String) value;
     } else if (value instanceof Number) {
      r = String.valueOf(value);
     } else if (value instanceof BigDecimal) {
      r = String.valueOf(value);
     } else {
      if (!(value instanceof Date) && !(value instanceof Timestamp)) {
       if (!(value instanceof ZonedDateTime) && !(value instanceof LocalDateTime)) {
        if (value instanceof Enum) {
         r = ((Enum) value).name();
        } else if (value != null) {

         log.info("Error of create row, Unknow field type: " + value.getClass().getName());
        }
       } else {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        r = formatter.format((TemporalAccessor) value);
       }
      } else {
       DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       r = sdf.format(value);
      }
     }

     row.createCell(j).setCellValue(r);
    }
   }
  }
  return this;
 }

 /**
  *         
  */
 public ExcelBuilder autoColumnWidth() {
  for (int j = 0; j < sheet.getRow(0).getLastCellNum(); j++) {
   int maxLength = 0;
   for (int i = 0; i <= sheet.getLastRowNum(); i++) {
    String value = sheet.getRow(i).getCell(j).getStringCellValue();
    int length = 0;
    if (value != null) {
     length = value.getBytes().length;
    }
    if (length > maxLength) {
     maxLength = length;
    }
   }
   sheet.setColumnWidth(j, maxLength > 30 ? (30 * 256 + 186) : (maxLength * 256 + 186));
  }
  return this;
 }

 /**
  *    
  * @param hasHeader      
  * @return Excel  
  */
 public AbstractExcel build(Boolean hasHeader) {
  return hasHeader ? new HeaderExcel(sheet) : new NoHeaderExcel(sheet);
 }

 /**
  *
  * @param fontName     
  * @param isBold     
  * @param fontSize     
  * @return   
  */
 private HSSFFont font(String fontName, boolean isBold, int fontSize) {
  HSSFFont font = wb.createFont();
  if (fontName != null) font.setFontName(fontName);
  else font.setFontName("  ");
  font.setBold(isBold);
  font.setFontHeightInPoints((short) fontSize);
  return font;
 }

}
excel 의 추상 적 인 부류:

/**
 * @author Sherman
 * created in 2018/8/24
 */

public abstract class AbstractExcel {
 private final HSSFSheet sheet;

 public AbstractExcel() {
  HSSFWorkbook wb = new HSSFWorkbook();
  sheet = wb.createSheet();
 }

 public AbstractExcel(String sheetName){
  HSSFWorkbook wb = new HSSFWorkbook();
  sheet = wb.createSheet(sheetName);
 }

 public AbstractExcel(HSSFSheet sheet) {
  this.sheet = sheet;
 }



 public abstract List<Map<String, String>> getPayload();


 public void write(OutputStream op) throws IOException {
  sheet.getWorkbook().write(op);
  sheet.getWorkbook().close();
 }

 public String getStringFormatCellValue(HSSFCell cell) {
  String cellVal = "";
  DecimalFormat df = new DecimalFormat("#");
  switch (cell.getCellTypeEnum()) {
   case STRING:
    cellVal = cell.getStringCellValue();
    break;
   case NUMERIC:
    String dataFormat = cell.getCellStyle().getDataFormatString();
    if (DateUtil.isCellDateFormatted(cell)) {
     cellVal = df.format(cell.getDateCellValue());
    } else if ("@".equals(dataFormat)) {
     cellVal = df.format(cell.getNumericCellValue());
    } else {
     cellVal = String.valueOf(cell.getNumericCellValue());
     df = new DecimalFormat("#.#########");
     cellVal = df.format(Double.valueOf(cellVal));
    }
    break;
   case BOOLEAN:
    cellVal = String.valueOf(cell.getBooleanCellValue());
    break;
   case FORMULA:
    cellVal = String.valueOf(cell.getCellFormula());
    break;
   default:
    cellVal = "";
  }
  return cellVal;
 }


}
표두 실현 류

/**
 * @author Sherman
 * created in 2018/8/24
 */

public class HeaderExcel extends AbstractExcel {
 private final static boolean hasHeader = true;
 private final HSSFSheet sheet;

 public HeaderExcel(HSSFSheet sheet) {
  super(sheet);
  this.sheet = sheet;
 }

 public HeaderExcel(String sheetName, String excelPath) {
  HSSFWorkbook wb = null;
  try {
   wb = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(excelPath)));
  } catch (IOException e) {
   e.printStackTrace();
  }
  sheet = sheetName == null || sheetName.isEmpty() ? wb.getSheetAt(0) : wb.getSheet(sheetName);
 }

 @Override
 public List<Map<String, String>> getPayload() {
  List<Map<String, String>> payLoad = new ArrayList<>();
  HSSFRow headRow = sheet.getRow(0);
  for (int i = 1; i <= sheet.getLastRowNum(); i++) {
   HSSFRow currentRow = sheet.getRow(i);
   Map<String, String> map = new HashMap<>();
   for (int j = 0; j < sheet.getRow(i).getLastCellNum(); j++) {
    map.put(getStringFormatCellValue(headRow.getCell(j)), getStringFormatCellValue(currentRow.getCell(j)));
   }
   payLoad.add(map);
  }
  return payLoad;
 }


}
표두 없 는 실현 클래스

/**
 * @author Sherman
 * created in 2018/8/24
 */

public class NoHeaderExcel extends AbstractExcel {
 private final static boolean hasHeader = false;
 private HSSFSheet sheet;

 public NoHeaderExcel(HSSFSheet sheet) {
  super(sheet);
  this.sheet = sheet;
 }

 public NoHeaderExcel(String sheetName, String excelPath) {
  HSSFWorkbook wb = null;
  try {
   wb = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(excelPath)));
  } catch (IOException e) {
   e.printStackTrace();
  }
  sheet = sheetName == null || sheetName.isEmpty() ? wb.getSheetAt(0) : wb.getSheet(sheetName);
 }


 @Override
 public List<Map<String, String>> getPayload() {
  List<Map<String, String>> payLoad = new ArrayList<>();
  for (int i = 0; i < sheet.getLastRowNum(); i++) {
   HSSFRow currentRow = sheet.getRow(i);
   Map<String, String> map = new HashMap<>();
   for (int j = 0; j <= sheet.getRow(i).getLastCellNum(); j++) {
    map.put(String.valueOf(j), getStringFormatCellValue(currentRow.getCell(j)));
   }
   payLoad.add(map);
  }
  return payLoad;
 }


}
테스트 도구 종류:

/**
 * Unit test for simple App.
 */
public class AppTest 
{
 /**
  *     ,    
  */
 @Test
 public void testExportExcel()
 {
  //    
  String[] headers = new String[]{"A","B","C","D","E"};
   List<List<Object>> valueList = new LinkedList<>();
  for (char i = 'A'; i <= 'E' ; i++) {
   List<Object> rowList = new LinkedList<>();
   for (int j = 0; j <= 4; j++) {
    rowList.add(i+String.valueOf(j));
   }
   valueList.add(rowList);
  }

 AbstractExcel excel = new ExcelBuilder("   ")
   .header(headers)
   .content(valueList)
   .autoColumnWidth()
   .build(true);

  try {
   File file = new File("E:\\excel\\test.xls");
   FileOutputStream op = new FileOutputStream(file);
   excel.write(op);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 /**
  *          
  */
 @Test
 public void testImportExcel(){
  AbstractExcel excel = new HeaderExcel(null,"E:/excel/test.xls");
  List<Map<String,String>> values = excel.getPayload();
  values.forEach(stringStringMap -> {
   stringStringMap.entrySet().forEach(stringStringEntry -> {
    System.out.println(stringStringEntry.getKey()+"---->"+stringStringEntry.getValue());
   });

  });
 }

}
부도:
테스트 1

테스트 2:

효과 가 괜 찮 은 것 같 습 니 다.물론 완선 되 지 않 은 부분 이 많 습 니 다.필요 한 친구 들 은 이 를 바탕 으로 맞 춤 형 제작 을 확대 할 수 있 습 니 다.예 를 들 어 표 데이터 구조 방식 을 읽 고 줄 수 를 늘 리 거나 검사 증 거 를 바 꾸 거나 표 제목 을 만 드 는 등 입 니 다.
혹은 친구 가 더 좋 은 실현 방안 을 가지 고 있 습 니 다.교류 하 러 오신 것 을 환영 합 니 다!
마지막 마지막,멍청 한 도구 의 원본 코드 를 첨부 하 는 것 을 잊 을 수 없 지!
https://github.com/yumiaoxia/excel-commom-demo.git

좋은 웹페이지 즐겨찾기