Use xlrd en Django para leer datos de tablas de Excel

Tabla de contenido

Método 1: Leer por línea

Método 2: según la correspondencia uno a uno entre los encabezados de la tabla y los datos de la tabla

Método 3: Leer por columna


Hablé sobre cómo leer los datos de la base de datos en Django y escribirlos en Excel.  Hoy, hablemos sobre cómo leer los datos en Excel (se pueden escribir en la base de datos después de leerlos)

El módulo xlrd debe instalarse antes de comenzar

instalación pip -i https://pypi.douban.com/simple xlrd

 La última versión se instala de manera predeterminada y admite archivos de Excel en formato xls. Si se trata de un formato de archivo xlsx, es posible que deba instalar una versión anterior de xlrd

Método 1: Leer por línea
import xlrd


class ReadExcel(View):
    def post(self, request):
        excel_file = request.FILES['excel_file']  # 获取上传的Excel文件

        workbook = xlrd.open_workbook(file_contents=excel_file.read())  # 打开Excel文件

        sheet_names = workbook.sheet_names()  # 获取所有工作表的名称
        # 方式一:按行
        data = []  # 存储所有工作表的数据
        for sheet_name in sheet_names:
            sheet = workbook.sheet_by_name(sheet_name)  # 获取具体的工作表

            rows = []
            for row_num in range(sheet.nrows):  # 迭代每一行数据
                row_values = sheet.row_values(row_num)  # 获取当前行的值
                rows.append(row_values)

            data.append({
                'sheet_name': sheet_name,
                'rows': rows,
            })

        return JsonResponse({"res": data})

Use el archivo de tabla book_data.xls, el contenido es el siguiente

 Resultado de salida:

{
    "res": [
        {
            "sheet_name": "图书表",
            "rows": [
                [
                    "图书名",
                    "地址",
                    "年代"
                ],
                [
                    "《Python+Cookbook》第三版中文v3.0.0.pdf",
                    "天津市",
                    "1999.11"
                ],
                [
                    "Django 2.2 官方文档中文版.pdf",
                    "北京市东城区",
                    "1980.07"
                ],
                [
                    "MySQL必知必会(文字版).pdf",
                    "南京市鼓楼区",
                    "2020.08"
                ],
                [
                    "PyCharm知识手册V1.0.pdf",
                    "安徽合肥市",
                    "1987.12"
                ],
                [
                    "流畅的Python.pdf",
                    "南京高淳区",
                    "2000.01"
                ],
                [
                    "深入理解Python中文版高清(Dive+into+Python)@www.java1234.com.pdf",
                    "河南洛阳",
                    "2023.10 "
                ]
            ]
        },
        {
            "sheet_name": "Sheet2",
            "rows": [
                [
                    "图片名",
                    "路径"
                ],
                [
                    "测试",
                    "测试路径"
                ]
            ]
        },
        {
            "sheet_name": "Sheet3",
            "rows": []
        }
    ]
}

Método 2: según la correspondencia uno a uno entre los encabezados de la tabla y los datos de la tabla
import xlrd


class ReadExcel(View):
    def post(self, request):
        excel_file = request.FILES['excel_file']  # 获取上传的Excel文件

        workbook = xlrd.open_workbook(file_contents=excel_file.read())  # 打开Excel文件

        sheet_names = workbook.sheet_names()  # 获取所有工作表的名称

        # 方式二:按表头与表数据一一对应关系
        data = []  # 存储所有工作表的数据
        for sheet_name in sheet_names:
            sheet = workbook.sheet_by_name(sheet_name)  # 获取具体的工作表
            if sheet.nrows != 0:
                rows = []
                first_row = sheet.row_values(0)  # 原表头数据
                # first_row = ['name', 'address', 'year']  # 使用对应的英文字段替换上面first_row从表中获取的中文表头名
                for row_num in range(1, sheet.nrows):  # 迭代每一行数据
                    row_values = sheet.row_values(row_num)  # 获取当前行的值
                    zip_data = dict(zip(first_row, row_values))
                    rows.append(zip_data)

                data.append({
                    'sheet_name': sheet_name,
                    'rows': rows,
                })

        return JsonResponse({"res": data})

El resultado es el siguiente:

{
    "res": [
        {
            "sheet_name": "图书表",
            "rows": [
                {
                    "图书名": "《Python+Cookbook》第三版中文v3.0.0.pdf",
                    "地址": "天津市",
                    "年代": "1999.11"
                },
                {
                    "图书名": "Django 2.2 官方文档中文版.pdf",
                    "地址": "北京市东城区",
                    "年代": "1980.07"
                },
                {
                    "图书名": "MySQL必知必会(文字版).pdf",
                    "地址": "南京市鼓楼区",
                    "年代": "2020.08"
                },
                {
                    "图书名": "PyCharm知识手册V1.0.pdf",
                    "地址": "安徽合肥市",
                    "年代": "1987.12"
                },
                {
                    "图书名": "流畅的Python.pdf",
                    "地址": "南京高淳区",
                    "年代": "2000.01"
                },
                {
                    "图书名": "深入理解Python中文版高清(Dive+into+Python)@www.java1234.com.pdf",
                    "地址": "河南洛阳",
                    "年代": "2023.10 "
                }
            ]
        },
        {
            "sheet_name": "Sheet2",
            "rows": [
                {
                    "图片名": "测试",
                    "路径": "测试路径"
                }
            ]
        }
    ]
}

Método 3: Leer por columna
import xlrd


class ReadExcel(View):
    def post(self, request):
        excel_file = request.FILES['excel_file']  # 获取上传的Excel文件

        workbook = xlrd.open_workbook(file_contents=excel_file.read())  # 打开Excel文件

        sheet_names = workbook.sheet_names()  # 获取所有工作表的名称

        # 方式三:按列的方式
        data = []  # 存储所有工作表的数据
        for sheet_name in sheet_names:
            sheet = workbook.sheet_by_name(sheet_name)  # 获取具体的工作表
            if sheet.nrows != 0:
                cols = []
                cols_data = {}
                for col_num in range(sheet.ncols):  # 迭代每一列数据
                    first_row = sheet.col_values(col_num, 0, 1)[0]  # 获取每一列第一行的数据(也就是表头)
                    col_values = sheet.col_values(col_num, 1)  # 从列的第二行开始获取数据
                    cols_data.update({first_row: col_values})
                cols.append(cols_data)

                data.append({
                    'sheet_name': sheet_name,
                    'cols': cols,
                })

        return JsonResponse({"res": data})

El resultado es el siguiente:

{
    "res": [
        {
            "sheet_name": "图书表",
            "cols": [
                {
                    "图书名": [
                        "《Python+Cookbook》第三版中文v3.0.0.pdf",
                        "Django 2.2 官方文档中文版.pdf",
                        "MySQL必知必会(文字版).pdf",
                        "PyCharm知识手册V1.0.pdf",
                        "流畅的Python.pdf",
                        "深入理解Python中文版高清(Dive+into+Python)@www.java1234.com.pdf"
                    ],
                    "地址": [
                        "天津市",
                        "北京市东城区",
                        "南京市鼓楼区",
                        "安徽合肥市",
                        "南京高淳区",
                        "河南洛阳"
                    ],
                    "年代": [
                        "1999.11",
                        "1980.07",
                        "2020.08",
                        "1987.12",
                        "2000.01",
                        "2023.10 "
                    ]
                }
            ]
        },
        {
            "sheet_name": "Sheet2",
            "cols": [
                {
                    "图片名": [
                        "测试"
                    ],
                    "路径": [
                        "测试路径"
                    ]
                }
            ]
        }
    ]
}

Hay tres formas de leer

Supongo que te gusta

Origin blog.csdn.net/qq_37140721/article/details/131593265
Recomendado
Clasificación