xlsxwriter 图表类别文件大小
xlsxwriter chart categories file size
以下代码将 CSV 作为输入并输出包含条形图的 XLSX:
import pandas
import sys
import openpyxl
from openpyxl.chart import BarChart, Reference
# ---- Data preparation ----
path = sys.argv[1]
df = pandas.read_csv(path, sep = "\t")
df = df[pandas.notnull(df['response_time'])]
df.loc[:, "datetime"].replace(to_replace = r"(.*T)", value = r"", inplace = True, regex = True)
df = pandas.pivot(df.datetime, df.name + '-' + df.type, df.response_time)
# ---- Prepare writer, workbook and worksheet ----
writer = pandas.ExcelWriter("test.xlsx", engine = 'xlsxwriter')
df.to_excel(writer, sheet_name = "graph")
workbook = writer.book
worksheet = writer.sheets["graph"]
# ---- USING OPENPYXL ----
chart1 = BarChart()
chart1.x_axis_title = "DateTime"
chart1.x_axis_title = "Response time"
data = Reference(workbook.active, min_col = 2, min_row = 1, max_col = len(df.columns) + 1, max_row = workbook.active.max_row)
xval = Reference(workbook.active, min_col = 1, min_row = 2, max_row = workbook.active.max_row)
chart1.add_data(data, titles_from_data = True)
chart1.set_categories(xval)
workbook.active.add_chart(chart1, "D4")
workbook.save("test.xlsx")
# ---- USING XLSXWRITER ----
chart = workbook.add_chart({'type' : 'column'})
for i in range(1, len(df.columns) + 1):
chart.add_series({
'name' : ['graph', 0, i],
'values' : ['graph', 1, i, len(df.index), i],
'categories': ['graph', 1, 0, len(df.index), 0],
})
chart.set_x_axis({'name' : 'DateTime'})
chart.set_y_axis({'name' : 'Response Time'})
worksheet.insert_chart('D4', chart)
writer.save()
输出图为:
openpyxl 和 xlsxwriter 版本生成完全相同的图形。问题是 xlsxwriter 版本输出图是 10MB 但 openpyxl 只有 3MB.
查了一下,发现是xlsxwriter版本中的'categories'条目增加了比较大的权重。
当我评论它时,我的X轴现在是从1到n的系列,但输出只有1.6MB,这怎么可能?如何使用 xlsxwriter 使输出更轻量级?
XlsxWriter 文件可能更大,因为它存储了图表类别和图表以及工作表的数据值,就像 Excel 一样。这为 Excel 生成的文件提供了更好的保真度,这是 XlsxWriter 的目标,并且当图表嵌入到其他应用程序(例如 PowerPoint)中时也会导致更少的问题。
根据您的分析,我猜想 openpyxl 不会存储额外的数据。
如果您在 Excel 中重新保存 XlsxWriter 或 openpyxl 文件,我希望您最终得到的文件大小与 XlsxWriter 文件大致相同。
以下代码将 CSV 作为输入并输出包含条形图的 XLSX:
import pandas
import sys
import openpyxl
from openpyxl.chart import BarChart, Reference
# ---- Data preparation ----
path = sys.argv[1]
df = pandas.read_csv(path, sep = "\t")
df = df[pandas.notnull(df['response_time'])]
df.loc[:, "datetime"].replace(to_replace = r"(.*T)", value = r"", inplace = True, regex = True)
df = pandas.pivot(df.datetime, df.name + '-' + df.type, df.response_time)
# ---- Prepare writer, workbook and worksheet ----
writer = pandas.ExcelWriter("test.xlsx", engine = 'xlsxwriter')
df.to_excel(writer, sheet_name = "graph")
workbook = writer.book
worksheet = writer.sheets["graph"]
# ---- USING OPENPYXL ----
chart1 = BarChart()
chart1.x_axis_title = "DateTime"
chart1.x_axis_title = "Response time"
data = Reference(workbook.active, min_col = 2, min_row = 1, max_col = len(df.columns) + 1, max_row = workbook.active.max_row)
xval = Reference(workbook.active, min_col = 1, min_row = 2, max_row = workbook.active.max_row)
chart1.add_data(data, titles_from_data = True)
chart1.set_categories(xval)
workbook.active.add_chart(chart1, "D4")
workbook.save("test.xlsx")
# ---- USING XLSXWRITER ----
chart = workbook.add_chart({'type' : 'column'})
for i in range(1, len(df.columns) + 1):
chart.add_series({
'name' : ['graph', 0, i],
'values' : ['graph', 1, i, len(df.index), i],
'categories': ['graph', 1, 0, len(df.index), 0],
})
chart.set_x_axis({'name' : 'DateTime'})
chart.set_y_axis({'name' : 'Response Time'})
worksheet.insert_chart('D4', chart)
writer.save()
输出图为:
openpyxl 和 xlsxwriter 版本生成完全相同的图形。问题是 xlsxwriter 版本输出图是 10MB 但 openpyxl 只有 3MB.
查了一下,发现是xlsxwriter版本中的'categories'条目增加了比较大的权重。
当我评论它时,我的X轴现在是从1到n的系列,但输出只有1.6MB,这怎么可能?如何使用 xlsxwriter 使输出更轻量级?
XlsxWriter 文件可能更大,因为它存储了图表类别和图表以及工作表的数据值,就像 Excel 一样。这为 Excel 生成的文件提供了更好的保真度,这是 XlsxWriter 的目标,并且当图表嵌入到其他应用程序(例如 PowerPoint)中时也会导致更少的问题。
根据您的分析,我猜想 openpyxl 不会存储额外的数据。
如果您在 Excel 中重新保存 XlsxWriter 或 openpyxl 文件,我希望您最终得到的文件大小与 XlsxWriter 文件大致相同。