Práctica de importación y exportación por lotes de archivos de implementación de Java (compatible con xls, xlsx)

1. Introducción

Java implementa la importación de archivos y la base de datos de exportación, que es una función relativamente común en la mayoría de los sistemas en la actualidad. Hoy, escribo una pequeña demostración para comprender el principio. Los estudiantes que nunca se han puesto en contacto también pueden echar un vistazo y consultarlo.

En la actualidad, las tecnologías de importación y exportación con las que he entrado en contacto incluyen principalmente POI e iReport. Poi se usa principalmente para importar algunos datos a la base de datos en lotes e iReport se usa para exportar informes. Además, también hay una forma similar a poi en jxl, pero parece que no se ha actualizado durante mucho tiempo. Las oficinas posteriores a 2007 no parecen admitirlo, así que no hablaré de eso aquí.

2. Explicación detallada del uso de PDI

2.1 ¿Qué es Apache POI?

Apache POI es una biblioteca de código abierto de Apache Software Foundation. POI proporciona API para que los programas Java lean y escriban archivos en formato Microsoft Office.

2.2 Importación de paquetes de POI jar

Este tutorial usa el proyecto maven, y la versión del paquete jar usa poi-3.14 y poi-ooxml-3.14. La última versión es 3.16. Debido a que la api relacionada se ha actualizado después de 3.15, algunas operaciones pueden ser diferentes, por favor, preste atención.

<!-- poi的包 3.15版本后单元格类型获取方式有调整 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
        </dependency>

2.3 explicación de la API de POI

2.3.1 Estructura

HSSF: proporciona la función de leer y escribir archivos en formato Microsoft Excel.
XSSF: proporciona la función de leer y escribir archivos en formato Microsoft Excel OOXML.
HWPF: proporciona la función de leer y escribir archivos en formato Microsoft Word.
HSLF: proporciona la función de leer y escribir archivos en formato Microsoft PowerPoint.
HDGF: proporciona la función de leer y escribir archivos en formato Microsoft Visio.

2.3.2 Objeto

Este artículo presenta principalmente los dos componentes de HSSF y XSSF. Simplemente hablando, HSSF se usa para operar el archivo excel.xls antes de la versión de Office 2007 y XSSF se usa para operar el archivo excel.xlsx después de la versión de Office 2007. Tenga en cuenta que los sufijos de los dos son diferentes.

HSSF está en el paquete org.apache.poi.hssf.usermodel. Implementa la interfaz del libro de trabajo para el formato .xls en archivos de Excel

Componentes comunes:


HSSFWorkbook: objeto de documento de excel HSSFSheet: formulario de excel
HSSFRow: fila de excel
HSSFCell: celda de cuadrícula de excel
HSSFFont: fuente de excel
HSSFDataFormat: formato de fecha
HSSFHeader: encabezado de hoja
HSSFFooter: cola de hoja (el efecto solo se puede ver cuando se imprime)

estilo:

HSSFCellStyle: estilo de celda

Las operaciones auxiliares incluyen:

HSSFDateUtil: Fecha
HSSFPrintSetup: Imprimir
HSSFErrorConstants: Tabla de mensajes de error

XSSF está en el paquete org.apache.xssf.usemodel e implementa la interfaz del libro de trabajo para el formato .xlsx en el archivo de Excel

Componentes comunes:

XSSFWorkbook: objeto de documento de Excel
XSSFSheet: formulario de Excel
XSSFRow: fila de Excel
XSSFCell: celda de cuadrícula de Excel
XSSFFont: fuente de Excel
XSSFDataFormat: formato de fecha

Similar a HSSF;

2.3.3 Descripción de los tipos de campo comunes a dos componentes

De hecho, los dos componentes son para los dos formatos de Excel y la mayoría de las operaciones son las mismas.


单元格类型                        描述CELL_TYPE_BLANK          代表空白单元格CELL_TYPE_BOOLEAN        代表布尔单元(true或false)CELL_TYPE_ERROR          表示在单元的误差值CELL_TYPE_FORMULA        表示一个单元格公式的结果CELL_TYPE_NUMERIC        表示对一个单元的数字数据CELL_TYPE_STRING         表示对一个单元串(文本)

2.3.4 Pasos de operación

Tomando HSSF como ejemplo, las operaciones XSSF son las mismas.

Primero, comprenda la organización de un archivo de Excel. Un archivo de Excel corresponde a un libro de trabajo (HSSFWorkbook). Un libro de trabajo puede estar compuesto por varias hojas (HSSFSheet). Una hoja se compone de varias filas (HSSFRow). Se compone de varias celdas (HSSFCell).

1. Utilice HSSFWorkbook para abrir o crear un "objeto de archivo de Excel"

2. Utilice el objeto HSSFWorkbook para devolver o crear un objeto Hoja

3. Use el objeto Hoja para devolver el objeto de fila y use el objeto de fila para obtener el objeto Celda

4. Leer y escribir en el objeto Cell.

3. Operación de código

3.1 Imagen de efecto

Convención, mire las representaciones antes de publicar el código

Uno para cada uno de los dos formatos de archivos de Excel:


 


Después de importar: (importé dos veces y no verifiqué)

Efecto de exportación:

3.2 Código detallado

Aquí tomo Spring + SpringMVC + Mybatis como base, y extiendo: SpringBoot + Mybatis tutorial de construcción de proyectos de múltiples módulos

Controlador:

package com.root.controller;

import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.formula.functions.Mode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.root.pojo.Student;
import com.root.service.StudentService;
/**
 * 
 * @author SpringRoot
 *
 */
@Controller
public class StudentController {
    @Autowired
    private StudentService studentService;
    /**
     * 批量导入表单数据
     * 
     * @param request
     * @param myfile
     * @return
     */

    @RequestMapping(value="/importExcel",method=RequestMethod.POST)
    public String importExcel(@RequestParam("myfile") MultipartFile myFile) {
        ModelAndView modelAndView = new ModelAndView();
        try {
            Integer num = studentService.importExcel(myFile);
        } catch (Exception e) {
            modelAndView.addObject("msg", e.getMessage());
            return "index";
        }
        modelAndView.addObject("msg", "数据导入成功");

        return "index";
    }

    @RequestMapping(value="/exportExcel",method=RequestMethod.GET)
    public void exportExcel(HttpServletResponse response) {    
        try {
            studentService.exportExcel(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



}

Servicio

package com.root.service.impl;

import java.io.OutputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.root.mapper.StudentMapper;
import com.root.pojo.Student;
import com.root.service.StudentService;
/**
 * 
 * @author SpringRoot
 *
 */
@Service
public class StudentServiceImpl implements StudentService{
    private final static String XLS = "xls";  
    private final static String XLSX = "xlsx"; 
    @Autowired
    private StudentMapper studentMapper;
    /**
     * 导入Excel,兼容xls和xlsx
     */
    @SuppressWarnings("resource")
    public Integer importExcel(MultipartFile myFile) throws Exception {
        //        1、用HSSFWorkbook打开或者创建“Excel文件对象”
        //
        //        2、用HSSFWorkbook对象返回或者创建Sheet对象
        //
        //        3、用Sheet对象返回行对象,用行对象得到Cell对象
        //
        //        4、对Cell对象读写。
        //获得文件名  
        Workbook workbook = null ;
        String fileName = myFile.getOriginalFilename(); 
        if(fileName.endsWith(XLS)){  
            //2003  
            workbook = new HSSFWorkbook(myFile.getInputStream());  
        }else if(fileName.endsWith(XLSX)){  
            //2007  
            workbook = new XSSFWorkbook(myFile.getInputStream());  
        }else{
            throw new Exception("文件不是Excel文件");
        }

        Sheet sheet = workbook.getSheet("Sheet1");
        int rows = sheet.getLastRowNum();// 指的行数,一共有多少行+
        if(rows==0){
            throw new Exception("请填写数据");
        }
        for (int i = 1; i <= rows+1; i++) {
            // 读取左上端单元格
            Row row = sheet.getRow(i);
            // 行不为空
            if (row != null) {
                // **读取cell**
                Student student = new Student();
                //姓名
                String name = getCellValue(row.getCell(0));
                student.setName(name);
                //班级
                String classes = getCellValue(row.getCell(1));
                student.setClasses(classes);
                //分数
                String scoreString = getCellValue(row.getCell(2));
                if (!StringUtils.isEmpty(scoreString)) {
                    Integer score = Integer.parseInt(scoreString);
                    student.setScore(score);
                }
                //考试时间
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//小写的mm表示的是分钟  
                String dateString = getCellValue(row.getCell(3));  
                if (!StringUtils.isEmpty(dateString)) {
                    Date date=sdf.parse(dateString);  
                    student.setTime(date);
                }
                studentMapper.insert(student);
            }
        }
        return rows-1;
    }

    /**
     * 获得Cell内容
     * 
     * @param cell
     * @return
     */
    public String getCellValue(Cell cell) {
        String value = "";
        if (cell != null) {
            // 以下是判断数据的类型
            switch (cell.getCellType()) {
            case HSSFCell.CELL_TYPE_NUMERIC: // 数字
                value = cell.getNumericCellValue() + "";
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    Date date = cell.getDateCellValue();
                    if (date != null) {
                        value = new SimpleDateFormat("yyyy-MM-dd").format(date);
                    } else {
                        value = "";
                    }
                } else {
                    value = new DecimalFormat("0").format(cell.getNumericCellValue());
                }
                break;
            case HSSFCell.CELL_TYPE_STRING: // 字符串
                value = cell.getStringCellValue();
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
                value = cell.getBooleanCellValue() + "";
                break;
            case HSSFCell.CELL_TYPE_FORMULA: // 公式
                value = cell.getCellFormula() + "";
                break;
            case HSSFCell.CELL_TYPE_BLANK: // 空值
                value = "";
                break;
            case HSSFCell.CELL_TYPE_ERROR: // 故障
                value = "非法字符";
                break;
            default:
                value = "未知类型";
                break;
            }
        }
        return value.trim();
    }
    /**
     * 导出excel文件
     */
    public void exportExcel(HttpServletResponse response) throws Exception {
        // 第一步,创建一个webbook,对应一个Excel文件  
        HSSFWorkbook wb = new HSSFWorkbook();  
        // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet  
        HSSFSheet sheet = wb.createSheet("Sheet1");  
        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short  
        HSSFRow row = sheet.createRow(0);  
        // 第四步,创建单元格,并设置值表头 设置表头居中  
        HSSFCellStyle style = wb.createCellStyle();  
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式  

        HSSFCell cell = row.createCell(0);
        cell.setCellValue("姓名");  
        cell.setCellStyle(style);  
        cell = row.createCell(1);  
        cell.setCellValue("班级");  
        cell.setCellStyle(style);  
        cell = row.createCell(2);  
        cell.setCellValue("分数");  
        cell.setCellStyle(style);  
        cell = row.createCell(3);  
        cell.setCellValue("时间");  
        cell.setCellStyle(style);  

        // 第五步,写入实体数据 实际应用中这些数据从数据库得到,  
        List<Student> list = studentMapper.selectAll();  

        for (int i = 0; i < list.size(); i++){  
            row = sheet.createRow(i + 1);  
            Student stu = list.get(i);  
            // 第四步,创建单元格,并设置值  
            row.createCell(0).setCellValue(stu.getName());  
            row.createCell(1).setCellValue(stu.getClasses());  
            row.createCell(2).setCellValue(stu.getScore());  
            cell = row.createCell(3);  
            cell.setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(stu.getTime()));  
        }          
        //第六步,输出Excel文件
        OutputStream output=response.getOutputStream();
        response.reset();
        long filename = System.currentTimeMillis();
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式
        String fileName = df.format(new Date());// new Date()为获取当前系统时间
        response.setHeader("Content-disposition", "attachment; filename="+fileName+".xls");
        response.setContentType("application/msexcel");        
        wb.write(output);
        output.close();
    }  

}

3.3 Suplemento de API de archivo de exportación

Puede ver que el código de servicio anterior es solo la exportación más básica.

En aplicaciones prácticas, los archivos de Excel exportados a menudo deben leerse e imprimirse, lo que requiere la configuración de diseño y estilo de los documentos de Excel de salida. Las operaciones principales incluyen la combinación de celdas, la configuración de estilos de celda y la configuración de estilos de fuente.

3.3.1 Combinación de celdas

Utilice el método addMergedRegion () de HSSFSheet

public int addMergedRegion(CellRangeAddress region)

El parámetro CellRangeAddress representa el área que se fusionará, y el método de construcción es el siguiente: la fila inicial, la fila final, la columna inicial y la columna final a su vez

CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)

3.3.2 Establecer la altura de fila y el ancho de columna de una celda

HSSFSheet sheet=wb.createSheet();
sheet.setDefaultRowHeightInPoints(10);//设置缺省列高sheet.setDefaultColumnWidth(20);//设置缺省列宽
//设置指定列的列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之一
sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50);

3.3.3 Establecer estilo de celda

1. Cree HSSFCellStyle

HSSFCellStyle cellStyle=wkb.createCellStyle()

2. Establece el estilo

// 设置单元格的横向和纵向对齐方式,具体参数就不列了,参考HSSFCellStyle
  cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);
  cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  /* 设置单元格的填充方式,以及前景颜色和背景颜色
   三点注意:
   1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;
   2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;
   3.前景颜色不是字体颜色。
  */
  //设置填充方式(填充图案)
  cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);
  //设置前景色
  cellStyle.setFillForegroundColor(HSSFColor.RED.index);
  //设置背景颜色
  cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
  // 设置单元格底部的边框及其样式和颜色
  // 这里仅设置了底边边框,左边框、右边框和顶边框同理可设
  cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);
  cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);
  //设置日期型数据的显示样式
  cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));

3. Aplicar estilos a las celdas

  cell.setCellStyle(cellStyle);
  //将样式应用到行,但有些样式只对单元格起作用
  row.setRowStyle(cellStyle);

3.3.4 Establecer estilo de fuente

1. Cree el objeto HSSFFont (llame al método createFont de HSSFWorkbook)

HSSFWorkbook wb=new HSSFWorkbook();
HSSFFont  fontStyle=wb.createFont();
HSSFWorkbook wb=new HSSFWorkbook ();

2. Configure varios estilos de fuentes

  //设置字体样式
  fontStyle.setFontName("宋体");  
  //设置字体高度
  fontStyle.setFontHeightInPoints((short)20);  
  //设置字体颜色
  font.setColor(HSSFColor.BLUE.index);
  //设置粗体
  fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  //设置斜体
  font.setItalic(true);
  //设置下划线
  font.setUnderline(HSSFFont.U_SINGLE);

3. Establezca la fuente en el estilo de celda.

//字体也是单元格格式的一部分,所以从属于HSSFCellStyle
// 将字体对象赋值给单元格样式对象
cellStyle.setFont(font);
// 将单元格样式应用于单元格
cell.setCellStyle(cellStyle);

Puede ver que la exportación de archivos con poi es bastante problemática. La próxima vez presentaré el método irport.

La API exportada es básicamente estos. Finalmente, espero que lo anterior pueda ser útil para todos.

Supongo que te gusta

Origin blog.csdn.net/baidu_39322753/article/details/104944229
Recomendado
Clasificación