Python能夠輕鬆地從字節流中加載文件,在不依賴於外部存儲的情況下直接對其進行讀取、修改等複雜操作,並最終將更改後的文檔保存回字節串中。這種能力不僅極大地提高了數據處理的靈活性,還確保了數據的安全性和完整性,尤其是在網絡傳輸或內存中處理敏感信息時。本文將介紹如何使用Python創建和保存Excel文件到字節流,以及讀取和修改字節流中的Excel文件。
- Python創建Excel文件並保存到字節流
- Python直接讀取字節流中的Excel文件
- Python編輯字節流中的Excel文件
本文所使用的方法需要用到Spire.XLS for Python,PyPI:pip install spire.xls。
申請免費License
Python創建Excel文件並保存到字節流
我們可以通過創建一個Workbook實例從而創建一個Excel工作簿,然後向其中添加數據並設置好格式,最後使用Workbook.SaveToStream()方法將其保存到指定的bytes或bytearray中。以下是操作步驟示例:
- 導入所需模塊。
- 創建
Workbook對象從而新建一個Excel工作簿,新建的工作簿中會有三個默認工作表。 - 使用
Workbook.Worksheets.get_Item()方法獲取一個工作表。 - 定義數據列表,或從其他地方導入數據。
- 通過
Worksheet.Range.get_Item().Value或.NumberValue屬性寫入數據到工作表中。 - 通過
CellRange.Style中的屬性設置單元格格式。 - 使用
Worksheet.AutoFitColumn()方法自動調整列寬。 - 創建
Stream對象。 - 使用
Workbook.SaveToStream()方法將Excel工作簿保存到Stream對象。 - 將
Stream對象轉換為bytes或bytearray,或寫入已有的bytearray中。 - 釋放資源。
代碼示例
from spire.xls import Workbook, FileFormat, Stream, Color, HorizontalAlignType
# 創建一個工作簿實例
workbook = Workbook()
# 獲取第一個工作表
sheet = workbook.Worksheets.get_Item(0)
# 創建或讀取一個二維數據列表
data = [
["書名", "作者", "出版年份", "類型", "價格 (人民幣)"],
["了不起的蓋茨比", "F. Scott Fitzgerald", 1925, "小説", 10.99],
["殺死一隻知更鳥", "Harper Lee", 1960, "小説", 8.99],
["1984", "George Orwell", 1949, "反烏托邦", 7.99],
["傲慢與偏見", "Jane Austen", 1813, "浪漫", 6.99],
["麥田裏的守望者", "J.D. Salinger", 1951, "小説", 9.99],
["美麗新世界", "Aldous Huxley", 1932, "反烏托邦", 8.49],
["霍比特人", "J.R.R. Tolkien", 1937, "奇幻", 12.99],
["動物莊園", "George Orwell", 1945, "寓言", 5.99],
["指環王", "J.R.R. Tolkien", 1954, "奇幻", 14.99],
["白鯨", "Herman Melville", 1851, "冒險", 11.99]
]
# 將數據插入到工作表中
for i, row in enumerate(data):
for j, value in enumerate(row):
if isinstance(value, str):
sheet.Range.get_Item(i + 1, j + 1).Value = value
else:
sheet.Range.get_Item(i + 1, j + 1).NumberValue = value
# 格式化標題行
headerRow = sheet.AllocatedRange.Rows.get_Item(0)
headerRow.Style.Color = Color.FromRgb(77, 189, 155)
headerRow.Style.Font.FontName = "宋體"
headerRow.Style.Font.Size = 14
headerRow.Style.Font.IsBold = True
headerRow.Style.HorizontalAlignment = HorizontalAlignType.Center
# 格式化數據行
for i in range(1, sheet.AllocatedRange.Rows.Count):
row = sheet.AllocatedRange.Rows.get_Item(i)
row.Style.Font.FontName = "宋體"
row.Style.Font.Size = 12
row.Style.HorizontalAlignment = HorizontalAlignType.Left
row.Style.Color = Color.FromRgb(255, 253, 208)
if i % 2 == 0:
row.Style.Color = Color.FromRgb(255, 248, 183)
# 自動調整列寬
for i in range(sheet.AllocatedRange.Columns.Count):
sheet.AutoFitColumn(i + 1)
# 創建一個流對象
stream = Stream()
# 將工作簿保存到流中
workbook.SaveToStream(stream, FileFormat.Version2016)
# 將流轉換為字節
bytes_data = stream.ToArray()
# 將字節寫入文件或按需要使用
with open("output/CreateExcelByStream.xlsx", "wb") as file:
file.write(bytes_data)
運行結果
Python直接讀取字節流中的Excel文件
我們可以使用Workbook.LoadFromStream(Stream(bytes))方法直接從字節流中加載PDF文檔,然後遍歷工作表中已使用的單元格的行和列,通過Worksheet.AllocatedRange.get_Item().Value屬性直接讀取單元格數據。以下是操作步驟示例:
- 導入所需模塊。
- 創建
Workbook對象。 - 使用
Workbook.LoadFromStream(Stream(bytes))方法從字節流中加載Excel文件。 - 使用
Workbook.Worksheets.get_Item()方法獲取指定工作表。 - 遍歷工作表中已使用的行和列,使用
Worksheet.AllocatedRange.get_Item().Value屬性獲取單元格數據。 - 輸出單元格數據或用於其他操作。
- 釋放資源。
代碼示例
from spire.xls import Workbook, Stream
# 創建一個字節對象或使用現有的字節對象
with open("output/CreateExcelByStream.xlsx", "rb") as file:
bytes_data = file.read()
# 創建一個工作簿實例
workbook = Workbook()
# 從字節流加載Excel文件
workbook.LoadFromStream(Stream(bytes_data))
# 獲取第一個工作表
sheet = workbook.Worksheets.get_Item(0)
# 從工作表讀取數據
# 創建一個列表來存儲數據
data = []
for i in range(sheet.AllocatedRange.Rows.Count):
# 獲取一行數據
row = sheet.AllocatedRange.Rows.get_Item(i)
# 創建一個列表來存儲該行的數據
row_data = []
for j in range(row.Cells.Count):
# 獲取單元格的值
cellValue = sheet.AllocatedRange.get_Item(i + 1, j + 1).Value
row_data.append(cellValue)
data.append(row_data)
# 打印數據或按需使用
for row in data:
print(row)
# 釋放資源
workbook.Dispose()
運行結果
Python編輯字節流中的Excel文件
同樣,我們也可以使用Workbook.LoadFromStream(Stream(bytes))方法直接從bytes或bytearray中加載PDF文檔,並對其進行修改編輯,然後使用Workbook.SaveToStream()方法將其保存回字節流中,從而實現編輯字節流中的Excel文件。以下是操作步驟示例:
- 導入所需模塊。
- 創建
Workbook對象。 - 使用字節流創建
Stream對象。 - 使用
Workbook.LoadFromStream()方法從Stream對象加載Excel文件。 - 使用
Workbook.Worksheets.get_Item()方法獲取指定工作表。 - 根據需要修改格式。
- 使用
Workbook.SaveToStream()方法將Excel工作簿保存回Stream對象。 - 將
Stream對象轉換為bytes或bytearray。 - 將字節流寫入文件或用於其他用途。
- 釋放資源。
代碼示例
from spire.xls import Workbook, Stream, HorizontalAlignType, Color, FileFormat
# 創建一個字節對象或使用現有的字節對象
with open("output/CreateExcelByStream.xlsx", "rb") as file:
bytes_data = file.read()
# 創建一個工作簿實例
workbook = Workbook()
# 從字節流加載Excel文件
stream = Stream(bytes_data)
workbook.LoadFromStream(stream)
stream.Close()
# 刪除多餘的工作表
#for i in range(1, workbook.Worksheets.Count):
# workbook.Worksheets.Remove(workbook.Worksheets.get_Item(i))
# 獲取第一個工作表
sheet = workbook.Worksheets.get_Item(0)
# 修改標題行的樣式
headerRow = sheet.AllocatedRange.Rows.get_Item(0)
headerRow.Style.Font.Bold = False
headerRow.Style.Font.FontName = "Calibri"
headerRow.Style.Font.Size = 12
headerRow.Style.HorizontalAlignment = HorizontalAlignType.Left
headerRow.Style.Color = Color.FromRgb(92, 64, 131)
# 修改數據行的樣式
for i in range(1, sheet.AllocatedRange.Rows.Count):
row = sheet.AllocatedRange.Rows.get_Item(i)
row.Style.Font.FontName = "Calibri"
row.Style.Font.Size = 11
row.Style.Color = Color.FromRgb(255, 237, 206)
if i % 2 == 0:
row.Style.Color = Color.FromRgb(255, 228, 181)
# 自動調整列寬
for i in range(sheet.AllocatedRange.Columns.Count):
sheet.AutoFitColumn(i + 1)
# 保存修改後的Excel文件
streamTemp = Stream()
workbook.SaveToStream(streamTemp, FileFormat.Version2016)
# 將流轉換回字節
bytes_data = streamTemp.ToArray()
# 將字節寫入文件或按需使用
with open("output/ModifiedExcel.xlsx", "wb") as file:
file.write(bytes_data)
運行結果
本文演示瞭如何用Python創建Excel工作簿保存到字節流,以及讀取和修改字節流中的Excel工作簿。