lifuquan 1 سال پیش
والد
کامیت
b5f984d7a3

+ 3 - 1
.gitignore

@@ -1,2 +1,4 @@
 **/target/
-**/download/
+**/download/
+# office临时文件
+**/~$*

+ 23 - 0
doc/开发文档/tsl_data/接口测试.md

@@ -0,0 +1,23 @@
+# 接口测试
+
+## 数据手动入库
+
+```http
+POST http://192.168.10.7:29100/tsl/warahouse/manually HTTP/1.1
+Content-Type:application/json
+
+{
+    "type":"MOBILE_COMP",
+    "day":"20230421"
+}
+```
+
+```http
+POST http://192.168.10.7:29100/tsl/warahouse/manually HTTP/1.1
+Content-Type:application/json
+
+{
+    "type":"HIGH_QUALITY",
+    "day":"20230421"
+}
+```

+ 2 - 0
doc/开发文档/数据库文档/建表.sql

@@ -49,6 +49,7 @@ CREATE TABLE report_auto.he_d_high_quality (
   fault_response_rate varchar(30) NULL,
   fault_response_list varchar(30) NULL,
   fault_response_count varchar(30) NULL,
+  cteate_time timestamp NULL DEFAULT now(),
 	CONSTRAINT he_d_high_quality_pkey PRIMARY KEY (id)
 );
 
@@ -103,5 +104,6 @@ CREATE TABLE report_auto.he_d_mobile_comp (
   duty_major_month varchar(300) NULL,
   duty_reason_id_month varchar(300) NULL,
   voice_text varchar(4136) NULL,
+  cteate_time timestamp NULL DEFAULT now(),
   CONSTRAINT he_d_mobile_comp_pkey PRIMARY KEY (id)
 )

+ 32 - 0
tsl_data/pom.xml

@@ -38,6 +38,18 @@
     </properties>
 
     <dependencies>
+        <!-- poi -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>5.2.3</version>
+        </dependency>
+        <!-- poi 2007 -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.3</version>
+        </dependency>
         <!-- commons-csv -->
         <dependency>
             <groupId>org.apache.commons</groupId>
@@ -78,4 +90,24 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.6.14</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <classifier>exec</classifier>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>

+ 88 - 0
tsl_data/src/main/java/com/nokia/common/http/R.java

@@ -0,0 +1,88 @@
+package com.nokia.common.http;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 返回值的统一包装
+ */
+public class R {
+    private Boolean success;
+    private String message;
+
+    private Map<String, Object> data = new HashMap<>();
+
+    /**
+     * 私有化构造方法,不允许在外部实例化
+     */
+    private R() {
+    }
+
+    /**
+     * 成功的静态方法
+     *
+     * @return R实例
+     */
+    public static R ok() {
+        R r = new R();
+        r.setSuccess(true);
+        r.setMessage("成功");
+        return r;
+    }
+
+    /**
+     * 失败的静态方法
+     *
+     * @return R实例
+     */
+    public static R error() {
+        R r = new R();
+        r.setSuccess(false);
+        r.setMessage("失败");
+        return r;
+    }
+
+    public R success(Boolean success) {
+        this.setSuccess(success);
+        return this;
+    }
+
+    public R message(String message) {
+        this.setMessage(message);
+        return this;
+    }
+
+    public R data(String key, Object value) {
+        this.data.put(key, value);
+        return this;
+    }
+
+    public R data(Map<String, Object> map) {
+        this.setData(map);
+        return this;
+    }
+
+    public Boolean getSuccess() {
+        return success;
+    }
+
+    public void setSuccess(Boolean success) {
+        this.success = success;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public Map<String, Object> getData() {
+        return data;
+    }
+
+    public void setData(Map<String, Object> data) {
+        this.data = data;
+    }
+}

+ 34 - 0
tsl_data/src/main/java/com/nokia/tsl_data/controller/TslWaraHouseConroller.java

@@ -0,0 +1,34 @@
+package com.nokia.tsl_data.controller;
+
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.nokia.common.http.R;
+import com.nokia.tsl_data.service.TslWaraHouseService;
+import com.nokia.tsl_data.vo.WarahouseManuallyRequest;
+
+/**
+ * 投诉率相关数据源入库
+ */
+@RequestMapping("/tsl/warahouse")
+@RestController
+public class TslWaraHouseConroller {
+
+    private final TslWaraHouseService tslWaraHouseService;
+
+    public TslWaraHouseConroller(TslWaraHouseService tslWaraHouseService) {
+        this.tslWaraHouseService = tslWaraHouseService;
+    }
+
+    @PostMapping("/manually")
+    public R warahouseManually(@RequestBody WarahouseManuallyRequest request) {
+        if (request.getType().equalsIgnoreCase("MOBILE_COMP")) {
+            tslWaraHouseService.waraHouseMobileComp(request.getDay());
+        } else if (request.getType().equalsIgnoreCase("HIGH_QUALITY")) {
+            tslWaraHouseService.waraHouseHighQuality(request.getDay());
+        }
+        return R.ok().message("入库成功");
+    }
+}

+ 15 - 0
tsl_data/src/main/java/com/nokia/tsl_data/dao/TslDao.java

@@ -0,0 +1,15 @@
+package com.nokia.tsl_data.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface TslDao {
+
+    /**
+     * 投诉清单按日按地市计数
+     */
+    List<Map<String, Object>> selectTslforMonth(String monthId);
+}

+ 85 - 5
tsl_data/src/main/java/com/nokia/tsl_data/service/TslWaraHouseService.java

@@ -1,16 +1,52 @@
 package com.nokia.tsl_data.service;
 
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVParser;
+import org.apache.commons.csv.CSVRecord;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 原始数据入库
  */
+@Slf4j
 @Service
 public class TslWaraHouseService {
 
     private final JdbcTemplate jdbcTemplate;
 
+    // 河北_CEM移网质量投诉明细 相关
+    @Value("${tslTask.source.MOBILE_COMP_SQL}")
+    private String MOBILE_COMP_SQL;
+    @Value("${tslTask.source.MOBILE_COMP_DIR}")
+    private String MOBILE_COMP_DIR;
+    @Value("${tslTask.source.MOBILE_COMP_PREFIX}")
+    private String MOBILE_COMP_PREFIX;
+    @Value("${tslTask.source.MOBILE_COMP_FIELD_NUM}")
+    private int MOBILE_COMP_FIELD_NUM;
+
+    // 河北_CEM高品质2日统计 相关 he_d_high_quality
+    @Value("${tslTask.source.HIGH_QUALITY_SQL}")
+    private String HIGH_QUALITY_SQL;
+    @Value("${tslTask.source.HIGH_QUALITY_DIR}")
+    private String HIGH_QUALITY_DIR;
+    @Value("${tslTask.source.HIGH_QUALITY_PREFIX}")
+    private String HIGH_QUALITY_PREFIX;
+    @Value("${tslTask.source.HIGH_QUALITY_FIELD_NUM}")
+    private int HIGH_QUALITY_FIELD_NUM;
+
     public TslWaraHouseService(JdbcTemplate jdbcTemplate) {
         this.jdbcTemplate = jdbcTemplate;
     }
@@ -19,18 +55,62 @@ public class TslWaraHouseService {
      * 河北_CEM移网质量投诉明细 数据入库
      * report_auto.he_d_mobile_comp
      */
-    public void waraHouseMobileComp() {
+    @Transactional
+    public void waraHouseMobileComp(String day) {
+        String filePath = MOBILE_COMP_DIR + MOBILE_COMP_PREFIX + day + ".csv";
+        try (Reader reader = new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8)) {
+            CSVParser parser = CSVFormat.DEFAULT.builder()
+                    .setRecordSeparator("\n")
+                    .setQuote(null)
+                    .setDelimiter("||")
+                    .setSkipHeaderRecord(false)
+                    .build().parse(reader);
+
+            List<CSVRecord> records = parser.getRecords();
+            List<Object[]> list = new ArrayList<>();
+            for (CSVRecord record : records) {
+                Object[] ps = new Object[MOBILE_COMP_FIELD_NUM];
+                list.add(ps);
+                for (int i = 0; i < ps.length; i++) {
+                    ps[i] = record.get(i);
+                }
+            }
+
+            jdbcTemplate.batchUpdate(MOBILE_COMP_SQL, list);
+        } catch (IOException e) {
+            log.info("csv文件读取错误--{}", filePath);
+            e.printStackTrace();
+        }
     }
 
     /**
      * 河北_CEM高品质2日统计 数据入库
      * report_auto.he_d_high_quality
      */
-    public void waraHouseHighQuality() {
+    public void waraHouseHighQuality(String day) {
+        String filePath = HIGH_QUALITY_DIR + HIGH_QUALITY_PREFIX + day + ".csv";
+        try (Reader reader = new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8)) {
+            CSVParser parser = CSVFormat.DEFAULT.builder()
+                    .setRecordSeparator("\n")
+                    .setQuote(null)
+                    .setDelimiter(",")
+                    .setSkipHeaderRecord(false)
+                    .build().parse(reader);
 
-    }
+            List<CSVRecord> records = parser.getRecords();
+            List<Object[]> list = new ArrayList<>();
+            for (CSVRecord record : records) {
+                Object[] ps = new Object[HIGH_QUALITY_FIELD_NUM];
+                list.add(ps);
+                for (int i = 0; i < ps.length; i++) {
+                    ps[i] = record.get(i);
+                }
+            }
 
-    public void readCsv(String path) {
-        
+            jdbcTemplate.batchUpdate(HIGH_QUALITY_SQL, list);
+        } catch (IOException e) {
+            log.info("csv文件读取错误--{}", filePath);
+            e.printStackTrace();
+        }
     }
 }

+ 12 - 0
tsl_data/src/main/java/com/nokia/tsl_data/vo/WarahouseManuallyRequest.java

@@ -0,0 +1,12 @@
+package com.nokia.tsl_data.vo;
+
+import lombok.Data;
+
+/**
+ * 手动入库请求
+ */
+@Data
+public class WarahouseManuallyRequest {
+    private String day;
+    private String type;
+}

+ 11 - 3
tsl_data/src/main/resources/application-dev.properties

@@ -1,7 +1,15 @@
+# 本地pc机数据库
+# spring.datasource.driver-class-name=org.postgresql.Driver
+# spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
+# spring.datasource.username=report_auto
+# spring.datasource.password=fantuan1985
 
+# 10.9上PG数据库
 spring.datasource.driver-class-name=org.postgresql.Driver
-spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
+spring.datasource.url=jdbc:postgresql://192.168.10.9:5432/sqmmt
 spring.datasource.username=report_auto
-spring.datasource.password=fantuan1985
+spring.datasource.password=Richr00t!
 
-mybatis.mapper-locations=classpath:mapper/*.xml
+# 测试环境路径配置--本地PC
+tslTask.source.MOBILE_COMP_DIR=D:/src/
+tslTask.source.HIGH_QUALITY_DIR=D:/src/

+ 5 - 1
tsl_data/src/main/resources/application-pro.properties

@@ -1 +1,5 @@
-
+# 10.9上PG数据库
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.datasource.url=jdbc:postgresql://192.168.10.9:5432/sqmmt
+spring.datasource.username=report_auto
+spring.datasource.password=Richr00t!

+ 15 - 2
tsl_data/src/main/resources/application.properties

@@ -1,5 +1,18 @@
-spring.profiles.active=dev
+spring.profiles.active=pro
 
-server.port=11111
+server.port=29100
+mybatis.mapper-locations=classpath:mapper/*.xml
 
 logging.level.com.nokia=debug
+
+tslTask.source.MOBILE_COMP_SQL=insert into report_auto.he_d_mobile_comp (month_id,day_id,acct_date,sheet_no,is_online_complete,contact_no,busi_no,serv_content,last_deal_content,deal_depart_name,deal_opinion,serv_type,bus_type,duty_reason,accept_channel,submit_channel,compl_area_local,duty_major,product_name,sp_product_code,pre_repair_name,pre_repair_charges,fault_location,cust_level,satisfaction_in_reply,is_ok_in_reply,accept_time,end_time,proce_time,cust_area,is_cust_serv_complete,is_send_sheet_complete,is_repeat,is_upgrade,is_timeout,gis_city,process_nums,deal_depart_name_1,deal_depart_name_2,deal_depart_name_3,first_call_back_time,proce_remark,duty_major_day,duty_reason_id_day,duty_major_month,duty_reason_id_month,voice_text) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);
+# 路径的配置最后一定要带上/
+tslTask.source.MOBILE_COMP_DIR=/data/nenglishangdian/HE_D_MOBILE_COMPLAINT_DETAILS_DAY/
+tslTask.source.MOBILE_COMP_PREFIX=HE_D_MOBILE_COMPLAINT_DETAILS_DAY_
+tslTask.source.MOBILE_COMP_FIELD_NUM=47
+
+tslTask.source.HIGH_QUALITY_SQL=insert into report_auto.he_d_high_quality (month_id,day_id,acct_date,businoareaname,profes_dep,big_type_name,small_type_name,total_complaints,hotline_complaints,other_complaint,litigation_volume,satisfaction_rate,satisfaction_count,total_evaluation,complaint_satisfied,complaint_satisfied_list,complaint_satisfied_count,complaint_resolution,complaint_resolution_list,complaint_resolution_count,complaint_response,complaint_response_list,complaint_response_count,complaint,fault_satisfaction_rate,fault_satisfaction_list,fault_satisfaction_count,fault_resolution_rate,fault_resolution_list,fault_resolution_count,fault_response_rate,fault_response_list,fault_response_count) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);
+# 路径的配置最后一定要带上/
+tslTask.source.HIGH_QUALITY_DIR=/data/nenglishangdian/HE_D_HIGH_QUALITY_COUNT_DAY/
+tslTask.source.HIGH_QUALITY_PREFIX=HE_D_HIGH_QUALITY_COUNT_DAY_
+tslTask.source.HIGH_QUALITY_FIELD_NUM=33

+ 8 - 0
tsl_data/src/main/resources/mapper/TslDao.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.nokia.tsl_data.dao.TslDao">
+    <select id="selectTslforMonth" resultType="Map"> select compl_area_local, day_id, count(1) from
+        report_auto.he_d_mobile_comp hdmc where month_id = #{monthId} group by compl_area_local,
+        day_id order by day_id,compl_area_local </select>
+</mapper>

+ 135 - 46
tsl_data/src/test/java/com/nokia/tsl_data/TslDataApplicationTest.java

@@ -1,61 +1,150 @@
 package com.nokia.tsl_data;
 
-import java.io.FileInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.csv.CSVFormat;
-import org.apache.commons.csv.CSVParser;
-import org.apache.commons.csv.CSVRecord;
+import java.time.LocalDateTime;
+import org.apache.poi.ss.usermodel.BorderStyle;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.RegionUtil;
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
+import org.apache.poi.xssf.usermodel.XSSFFont;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.jdbc.core.JdbcTemplate;
+
+import com.nokia.tsl_data.dao.TslDao;
 
 @SpringBootTest
 public class TslDataApplicationTest {
     @Autowired
-    private JdbcTemplate jdbcTemplate;
+    private TslDao tslDao;
+
+    @Test
+    void test1() {
+        LocalDateTime dateTime = LocalDateTime.now();
+        System.out.println(dateTime.getDayOfMonth());
+    }
 
     @Test
-    void test() {
-        String path = "D:/hb_cuc_code/report_auto/doc/开发文档/样本数据/输入/HE_D_MOBILE_COMPLAINT_DETAILS_DAY_20230409-src.csv";
-
-        //
-        String sql = "insert into report_auto.he_d_mobile_comp (month_id,day_id,acct_date,sheet_no,is_online_complete,contact_no,busi_no,serv_content,last_deal_content,deal_depart_name,deal_opinion,serv_type,bus_type,duty_reason,accept_channel,submit_channel,compl_area_local,duty_major,product_name,sp_product_code,pre_repair_name,pre_repair_charges,fault_location,cust_level,satisfaction_in_reply,is_ok_in_reply,accept_time,end_time,proce_time,cust_area,is_cust_serv_complete,is_send_sheet_complete,is_repeat,is_upgrade,is_timeout,gis_city,process_nums,deal_depart_name_1,deal_depart_name_2,deal_depart_name_3,first_call_back_time,proce_remark,duty_major_day,duty_reason_id_day,duty_major_month,duty_reason_id_month,voice_text) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
-
-        // String sql = "insert into report_auto.he_d_mobile_comp (month_id,day_id,acct_date) values (?,?,?)";
-        try (Reader reader = new InputStreamReader(new FileInputStream(path), StandardCharsets.UTF_8)) {
-
-            CSVParser parser = CSVFormat.DEFAULT.builder()
-                    .setRecordSeparator("\n")
-                    .setQuote(null)
-                    .setDelimiter("||")
-                    .setSkipHeaderRecord(false)
-                    .build().parse(reader);
-
-            List<CSVRecord> records = parser.getRecords();
-            List<Object[]> list = new ArrayList<>();
-            for (int i = 0; i < 10; i++) {
-                // Object[] ps = new String[] { "202304", "09", "20230409" };
-                Object[] ps = new Object[47];
-                list.add(ps);
-                for (int j = 0; j < ps.length; j++) {
-                    ps[j] = records.get(i).get(j);
-                }
-            }
-
-            int[] batchUpdate = jdbcTemplate.batchUpdate(sql, list);
-            System.out.println(Arrays.toString(batchUpdate));
-
-        } catch (IOException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
+    void test() throws IOException {
+        // List<Map<String, Object>> result = tslDao.selectTslforMonth("202304");
+        XSSFWorkbook workbook = new XSSFWorkbook();
+        Sheet sheet = workbook.createSheet("管理端-移网质量类");
+        Row row;
+        Cell cell;
+
+        LocalDateTime dateTime = LocalDateTime.now();
+        int dayOfMonth = dateTime.getDayOfMonth();
+
+        cell = sheet.createRow(0).createCell(0);
+        cell.setCellValue("2023年客服投诉清单各地市投诉率情况(管理端-移网质量类)");
+        cell.setCellStyle(getStyle2(workbook));
+
+        CellRangeAddress range = new CellRangeAddress(0, 0, 0, dayOfMonth + 7);
+        sheet.addMergedRegion(range);
+
+        RegionUtil.setBorderBottom(BorderStyle.THIN, range, sheet);
+        RegionUtil.setBorderTop(BorderStyle.THIN, range, sheet);
+        RegionUtil.setBorderLeft(BorderStyle.THIN, range, sheet);
+        RegionUtil.setBorderRight(BorderStyle.THIN, range, sheet);
+
+        row = sheet.createRow(1);
+        cell = row.createCell(0);
+        cell.setCellValue("地市");
+        cell.setCellStyle(getStyle1(workbook));
+        sheet.autoSizeColumn(0);
+
+        for (int i = 1; i <= dayOfMonth; i++) {
+            cell = row.createCell(i);
+            cell.setCellValue((i) + "日");
+            cell.setCellStyle(getStyle1(workbook));
+            sheet.autoSizeColumn(i);
         }
+
+        cell = row.createCell(dayOfMonth + 1);
+        cell.setCellValue("投诉总量");
+        cell.setCellStyle(getStyle1(workbook));
+        sheet.autoSizeColumn(dayOfMonth + 1);
+
+        cell = row.createCell(dayOfMonth + 2);
+        cell.setCellValue("用户数");
+        cell.setCellStyle(getStyle1(workbook));
+        sheet.autoSizeColumn(dayOfMonth + 2);
+
+        cell = row.createCell(dayOfMonth + 3);
+        cell.setCellValue("目前万投率");
+        cell.setCellStyle(getStyle1(workbook));
+        sheet.autoSizeColumn(dayOfMonth + 3);
+
+        cell = row.createCell(dayOfMonth + 4);
+        cell.setCellValue("本月预测");
+        cell.setCellStyle(getStyle1(workbook));
+        sheet.autoSizeColumn(dayOfMonth + 4);
+
+        cell = row.createCell(dayOfMonth + 5);
+        cell.setCellValue("目标值");
+        cell.setCellStyle(getStyle1(workbook));
+        sheet.autoSizeColumn(dayOfMonth + 5);
+
+        cell = row.createCell(dayOfMonth + 6);
+        cell.setCellValue("与目标差距");
+        cell.setCellStyle(getStyle1(workbook));
+        sheet.autoSizeColumn(dayOfMonth + 6);
+
+        cell = row.createCell(dayOfMonth + 7);
+        cell.setCellValue("地市");
+        cell.setCellStyle(getStyle1(workbook));
+        sheet.autoSizeColumn(dayOfMonth + 7);
+
+        File file = new File("D:/src/test.xlsx");
+
+        FileOutputStream fout = new FileOutputStream(file);
+        workbook.write(fout);
+        fout.close();
+        workbook.close();
+    }
+
+    private XSSFFont getFont1(XSSFWorkbook workbook) {
+        XSSFFont font = workbook.createFont();
+        font.setFontName("等线");
+        font.setFontHeightInPoints((short) 9);
+        return font;
+    }
+
+    private CellStyle getStyle1(XSSFWorkbook workbook) {
+        XSSFCellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setFont(getFont1(workbook));
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        return cellStyle;
+    }
+
+    private XSSFFont getFont2(XSSFWorkbook workbook) {
+        XSSFFont font = workbook.createFont();
+        font.setFontName("等线");
+        font.setBold(true);
+        font.setFontHeightInPoints((short) 9);
+        return font;
+    }
+
+    private CellStyle getStyle2(XSSFWorkbook workbook) {
+        XSSFCellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setFont(getFont2(workbook));
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        return cellStyle;
     }
 }