赞
踩
- import xlwt
- import xlrd
-
-
- class ExcelHandler:
- def __init__(self, excel_name):
- self.excel_name = excel_name
-
- def write_title(self, worksheet, title):
- for i in range(len(title)):
- worksheet.write(0, i, title[i])
-
- def write_excel(self, title, rows):
- workbook = xlwt.Workbook(encoding='utf_8_sig')
- worksheet = workbook.add_sheet("Sheet1", cell_overwrite_ok=True)
- self.write_title(worksheet, title)
-
- red_style = xlwt.easyxf("font:colour_index red;")
- for i, row in enumerate(rows):
- for j, col in enumerate(row):
- worksheet.write(i + 1, j, col, red_style) # 内容从第二行开始写,避免覆盖表头
- # for row in range(len(rows)):
- # for column in range(len(rows[row])):
- # worksheet.write(row, column, rows[row][column])
- workbook.save(self.excel_name)
-
- def read_excel(self):
- workbook = xlrd.open_workbook(self.excel_name)
- worksheet = workbook.sheet_by_index(0) # 按索引获取 Sheet
- nrows = worksheet.nrows
- for nr in range(nrows):
- print(worksheet.row_values(nr))
-
- if __name__ == '__main__':
- title = ["column1", "column2", "column3"]
- # 存入的数据为二维列表形式
- rows = [
- [1, 2, 3],
- [2, 3, 4],
- [4, 5, 6]
- ]
- eh = ExcelHandler("test.xls")
-
- eh.write_excel(title, rows)
- eh.read_excel()

openpyxl 对扩展的 xlsx 支持比较好,对旧版的 xls 用 xlrd 和 xlwt 读写就好了,不然会报错。
openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.
相对而言,对表单和单元格的操作支持提升了不少。
- import openpyxl
- from openpyxl.worksheet.worksheet import Worksheet
-
-
- class ExcelHandler:
- def __init__(self, excel_name):
- self.excel_name = excel_name
- self.workbook = openpyxl.load_workbook(excel_name)
- self.worksheet: Worksheet = self.workbook['Sheet1']
- # sheet = self.workbook['Sheet1']
- # 上面两种写法等价,只不过添加变量类型声明后, 变量操作时"代码提示"更方便一些
-
- def get_sheet(self):
- # 1.获取 sheet 列表
- print('=====获取 sheet 列表=====')
- print(self.workbook.sheetnames) # 如:['Sheet1', 'Sheet2']
- print(self.workbook.worksheets) # 如:[<Worksheet "Sheet1">, <Worksheet "Sheet2">]
- # print(self.workbook.get_sheet_names()) # deprecated function 已弃用
-
- # 2.获取单个 sheet
- print('=====获取单个 sheet =====')
- print(self.workbook['Sheet1']) # 根据名称
- print(self.workbook.sheetnames[0]) # 根据下标,如:Sheet1
- print(self.workbook.worksheets[0]) # 根据下标,如:<Worksheet "Sheet">
-
- def create_sheet(self):
- # 1.末尾追加
- self.workbook.create_sheet('Sheet2')
-
- # 2.指定位置插入(index 从 0 开始,默认末尾)
- self.workbook.create_sheet('Sheet3', 0)
-
- # 3.注意:若 Sheet 已存在,会默认在名称后面追加数字,如:Sheet31、Sheet32
- self.workbook.create_sheet('Sheet3')
-
- # 4.保存(只有保存后,才会生效哦)
- self.workbook.save("test_sheet.xlsx")
-
- def copy_sheet(self):
- # 1.获取 sheet 对象
- sheet = self.workbook['Sheet1']
-
- # 2.复制 sheet(默认名称 + copy,如:Sheet Copy)
- self.workbook.copy_worksheet(sheet)
-
- # 3.保存(只有保存后,才会生效哦)
- self.workbook.save("test_sheet.xlsx")
-
- def delete_sheet(self):
- # self.copy_sheet()
- # 1.删除 sheet
- del self.workbook['Sheet1 Copy']
-
- # 2.保存后生效
- self.workbook.save("test_sheet.xlsx")
-
- def move_sheet(self):
- # 1.移动 sheet(负数=向左移动、正数=向右移动、数值=移动位置的个数)
- self.workbook.move_sheet('Sheet1', -1)
-
- # 2.保存后生效
- self.workbook.save(self.excel_name)
-
- def rename_sheet(self):
- # 1.重命名 sheet
- self.workbook['Sheet1'].title = 'Sheet111'
-
- # 2.保存后生效
- self.workbook.save(self.excel_name)
-
- def get_title(self, worksheet: Worksheet = None):
- if not worksheet:
- worksheet = self.worksheet
- title = next(worksheet.iter_rows(min_col=1, min_row=1, values_only=True))
- # print(title)
- # ('column1', 'column2', 'column3')
- return title
-
- # 查询表格基本属性(元数据)
- def read_meta_data(self, worksheet: Worksheet = None):
- if not worksheet:
- worksheet = self.worksheet
- # 与下列写法等价,只不过添加类型判断后, "代码提示"更方便一些了
- # sheet = self.workbook['Sheet1']
- print(f'title: {worksheet.title}') # 表单标题,如:Sheet1
- print(f'dimensions: {worksheet.dimensions}') # 表格大小,如:A1:C4 表示4行3列,与Excel默认的行列表示一致
- print(f'min_row: {worksheet.min_row}') # 最小行 1
- print(f'max_row: {worksheet.max_row}') # 最大行 4
- print(f'rows: {worksheet.rows}') # 行对象
-
- print(f'min_column: {worksheet.min_column}') # 最小列 1
- print(f'max_column: {worksheet.max_column}') # 最大列 3
- print(f'columns: {worksheet.columns}') # 列对象
-
- print(worksheet['B1'].value) # 查询单元格的数据 B1 表示第一行第二列对应单元格的数据
-
- # 读取数据
- def read_data(self, worksheet: Worksheet = None):
- if not worksheet:
- worksheet = self.worksheet
- # worksheet: Worksheet = self.workbook["Sheet1"]
- title = self.get_title()
- print("=====读取标题=====")
- print(title)
- # 按行读取数据
- print("=====按行读取数据=====")
- for row in worksheet.iter_rows(min_row=2, min_col=1, values_only=True):
- # min_row从第二行开始,跳过第一行的标题
- print(row)
- # (1, 2, 3)
- # (2, 3, 4)
- # (4, 5, 6)
- print("=====按单元格读取数据=====")
- # 按单元格读取数据,同时给出单元格的行号和列号
- for row in worksheet.iter_rows(min_row=2):
- for cell in row:
- print((cell.row, cell.column), cell.value) # openpyxl 单元格的下标都是从1开始的
- # (1, 1) column1
- # (1, 2) column2
- # (1, 3) column3
-
- # 查询和更新单元格数据
- def update_data(self, worksheet: Worksheet = None):
- if not worksheet:
- worksheet = self.worksheet
- # worksheet: Worksheet = self.workbook['Sheet1']
- worksheet["A2"] = "A2"
- # value = worksheet.cell(row=2, column=2).value
- # print(value)
- worksheet.cell(row=2, column=2).value = "B2"
- worksheet.cell(row=2, column=3, value="C2")
- # self.workbook.save(self.excel_name) # 保存生效到当前文件
- self.workbook.save("test2.xlsx") # 改动部分文件另存为
-
- # 追加数据
- def add_data(self, worksheet: Worksheet = None):
- if not worksheet:
- worksheet = self.worksheet
- # sheet: Worksheet = self.workbook['Sheet1']
- worksheet.append([5, 6, 7])
- self.workbook.save("test3.xlsx") # 改动部分文件另存为
-
- # 删除数据
- def delete_data(self, worksheet: Worksheet = None):
- if not worksheet:
- worksheet = self.worksheet
- # sheet: Worksheet = self.workbook['Sheet1']
- worksheet.delete_rows(idx=2, amount=2) # idx 行开始(含),往下删除 amount 行
- worksheet.delete_cols(idx=1, amount=2) # idx 列开始(含),往右删除 amount 行
- self.workbook.save("test4.xlsx") # 改动部分文件另存为
-
- # 清除表单数据
- def clear_data(self, worksheet: Worksheet = None):
- if not worksheet:
- worksheet = self.worksheet
- worksheet.delete_rows(idx=1, amount=worksheet.max_row)
- worksheet.delete_cols(idx=1, amount=worksheet.max_column)
-
- def write_data(self, title, rows):
- worksheet: Worksheet = self.workbook['Sheet1']
- self.clear_data(worksheet)
- worksheet.append(title)
- for row in rows:
- worksheet.append(row)
- self.workbook.save("test5.xlsx")
- # self.workbook.save(self.excel_name)
-
-
- if __name__ == '__main__':
- title = ["column1", "column2", "column3"]
- rows = [
- [1, 2, 3],
- [2, 3, 4],
- [4, 5, 6]
- ]
- eh = ExcelHandler("test.xlsx")
- # eh.get_sheet()
- # eh.create_sheet()
- # eh.copy_sheet()
- # eh.delete_sheet()
- # eh.move_sheet()
- # eh.rename_sheet()
- # print(eh.get_title())
- # eh.read_meta_data()
- # eh.read_data()
- # eh.update_data()
- # eh.add_data()
- # eh.delete_data()
- eh.write_data(title, rows)

- import csv
-
- title = ["第一列", "第二列", "第三列"]
- my_list = [
- title,
- [1, 2, 3],
- [2, 3, 4],
- [4, 5, 6]
- ]
-
- with open('test.csv', 'w', newline='', encoding='utf-8') as f:
- # with open('test.csv', 'a+', newline='', encoding='utf-8') as f:
- writer = csv.writer(f, delimiter=' ')
- for row in my_list:
- writer.writerow(row)
- # 第一列 第二列 第三列
- # 1 2 3
- # 2 3 4
- # 4 5 6
-
- with open('test.csv', 'r', encoding='utf-8') as f:
- reader = csv.reader(f)
- for row in reader:
- print(row)
- # ['第一列', '第二列', '第三列']
- # ['1', '2', '3']
- # ['2', '3', '4']
- # ['4', '5', '6']
-
'运行
我比较推荐下面这种 csv 读写方式,可以直接写一行数据,列的顺序由 filenames 决定(就算重新修改列顺序也很方便),这样就不用像其他写法那样刻意去关注 row 中元素的顺序了。
- import csv
-
- data = [
- {'age': 18, 'city': 'BeiJing'},
- {'age': 30, 'city': 'ShangHai'},
- {'age': 25, 'city': 'GuangZhou'},
- {'age': 40, 'city': 'ShenZhen'},
- ]
-
- with open('test.csv', 'w', newline='', encoding='utf-8') as f:
- fieldnames = ['age', 'city'] # fieldnames 的顺序决定了 csv 列的顺序
- writer = csv.DictWriter(f, fieldnames)
- writer.writeheader()
- for row in data:
- writer.writerow(row)
- # age city
- # 18 BeiJing
- # 30 ShangHai
- # 25 GuangZhou
- # 40 ShenZhen
-
- with open('test.csv', 'r') as f:
- reader = csv.DictReader(f)
- for row in reader:
- print(row)
- # OrderedDict([('age', '18'), ('city', 'BeiJing')])
- # OrderedDict([('age', '30'), ('city', 'ShangHai')])
- # OrderedDict([('age', '25'), ('city', 'GuangZhou')])
- # OrderedDict([('age', '40'), ('city', 'ShenZhen')])
'运行
- import pandas as pd
-
- data = {
- "age": [18, 30, 25, 40],
- "city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen"]
- }
- index = pd.Index(data=["Tom", "Bob", "Mary", "James"], name="name")
- user_info = pd.DataFrame(data=data, index=index)
-
- user_info.to_excel('test.xlsx')
- # name,age,city
- # Tom,18,BeiJing
- # Bob,30,ShangHai
- # Mary,25,GuangZhou
- # James,40,ShenZhen
-
- result = pd.read_excel("test.xlsx")
- # name age city
- # 0 Tom 18 BeiJing
- # 1 Bob 30 ShangHai
- # 2 Mary 25 GuangZhou
- # 3 James 40 ShenZhen
-
- title = list(result.keys())
- rows = list(result.values)
- print(title)
- # ['name', 'age', 'city']
- print(rows)
- # [array(['Tom', 18, 'BeiJing'], dtype=object),
- # array(['Bob', 30, 'ShangHai'], dtype=object),
- # array(['Mary', 25, 'GuangZhou'], dtype=object),
- # array(['James', 40, 'ShenZhen'], dtype=object)]
- #

与 to_excel,read_excel 用法类似
- import pandas as pd
-
- data = {
- "age": [18, 30, 25, 40],
- "city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen"]
- }
- index = pd.Index(data=["Tom", "Bob", "Mary", "James"], name="name")
- user_info = pd.DataFrame(data=data, index=index)
-
- user_info.to_csv('test.csv')
- # name,age,city
- # Tom,18,BeiJing
- # Bob,30,ShangHai
- # Mary,25,GuangZhou
- # James,40,ShenZhen
-
- result = pd.read_csv("test.csv")
- # name age city
- # 0 Tom 18 BeiJing
- # 1 Bob 30 ShangHai
- # 2 Mary 25 GuangZhou
- # 3 James 40 ShenZhen
-
- title = list(result.keys())
- rows = list(result.values)
- print(title)
- # ['name', 'age', 'city']
- print(rows)
- # [array(['Tom', 18, 'BeiJing'], dtype=object),
- # array(['Bob', 30, 'ShangHai'], dtype=object),
- # array(['Mary', 25, 'GuangZhou'], dtype=object),
- # array(['James', 40, 'ShenZhen'], dtype=object)]
-
- result = pd.read_csv("test.csv")
- print(result.shape)
- # (4, 3) 行和列数目
- columns = list(result.keys())
- print(columns)
- # ['name', 'age', 'city']
- for i in range(result.shape[0]): # 对每行进行遍历
- row = result[i:i + 1]
- for column in columns: # 获取每行的数据
- print(row[column].values[0], end=' ')
- # Tom 18 BeiJing
- # Bob 30 ShangHai
- # Mary 25 GuangZhou
- # James 40 ShenZhen
- print()
-
-
'运行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。