Use xlrd in Django to read excel table data

Table of contents

Method 1: Read by line

Method 2: According to the one-to-one correspondence between table headers and table data

Method 3: Read by column


I talked about how to read the database data in Django and write it into excel.  Today, let’s talk about how to read the data in excel. (After reading, it can be written into the database)

The xlrd module needs to be installed before starting

pip install -i https://pypi.douban.com/simple xlrd

 The latest version is installed by default, and it supports excel files in xls format. If it is an xlsx file format, you may need to install an old version of xlrd

Method 1: Read by line
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 the book_data.xls table file, the content is as follows

 Output result:

{
    "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": []
        }
    ]
}

Method 2: According to the one-to-one correspondence between table headers and table data
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})

The result is as follows:

{
    "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": [
                {
                    "图片名": "测试",
                    "路径": "测试路径"
                }
            ]
        }
    ]
}

Method 3: Read by column
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})

The result is as follows:

{
    "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": [
                {
                    "图片名": [
                        "测试"
                    ],
                    "路径": [
                        "测试路径"
                    ]
                }
            ]
        }
    ]
}

There are three ways to read

Guess you like

Origin blog.csdn.net/qq_37140721/article/details/131593265