使用 xlsxwriter ByteIO 对象写入 CSV 文件

Write CSV file using xlsxwriter ByteIO object

我正在使用 xlsxwriter ByteIO 对象创建一个 .xlsx 文件,我想使用相同的对象创建 .CSV 文件。可能吗?

这是我的代码:

outputStr=BytesIO()
workbook = xlsxwriter.Workbook(outputStr,{'in_memory': True})
worksheet = workbook.add_worksheet()

# Some data we want to write to the worksheet.
row = 0
col = 0
expenses=(['OriginalURL','NormalizedURL','Response','DuplicateOf','SourceId', 'RelatedSources'],)

for OriginalURL,NormalizedURL,Response,DuplicateOf,SourceId,RelatedSources in (expenses):
    worksheet.write(row, col,   OriginalURL)
    worksheet.write(row, col+1, NormalizedURL)
    worksheet.write(row, col+2, Response)
    worksheet.write(row, col+3, DuplicateOf)
    worksheet.write(row, col+4, SourceId)
    worksheet.write(row, col+5, RelatedSources)
    row += 1

workbook.close()

不存储文件,使用 "outputStr" 对象我在 JIRA 云中附加“.xlsx”文件。

这是 Jira 代码(使用 .xlsx 文件):

thisJira.add_attachment(issue=new_issue, attachment=outputStr, filename='Result.xlsx')

我想附加具有相同结果的 CSV 文件(我用 .csv 尝试过相同的代码,但它不起作用):

thisJira.add_attachment(issue=new_issue, attachment=outputStr, filename='CopyResult.csv')

我在 CSV 文件中收到此错误:

"The file format and extension of ".xls" 不匹配。文件可能已损坏或不安全。除非您信任其来源,否则请勿打开它。您是否仍要打开它?"

帮帮我!谢谢。

您可以使用内置的 csv 模块将 CSV 与 XLSX 文件一起编写,您只需要稍微不同地创建它:

import csv
import io
import xslxwriter

xlsx_data = io.BytesIO()
csv_data = io.StringIO()  # on Python 2.x use `io.BytesIO()`

# XLSX part
workbook = xlsxwriter.Workbook(xlsx_data, {'in_memory': True})
worksheet = workbook.add_worksheet()

# CSV part
csv_writer = csv.writer(csv_data)

# Some data we want to write to the worksheet.
expenses=(['OriginalURL', 'NormalizedURL', 'Response', 'DuplicateOf',
           'SourceId', 'RelatedSources'],)

for row, data in enumerate(expenses):
    # XSLX part
    worksheet.write_row(row, 0, data)  # if needed, add an offset to the row/column

    # CSV part
    csv_writer.writerow(data)

workbook.close()

# CSV data available in csv_data, XLSX data available in xlsx_data

从你的问题中不清楚是否要同时创建它们 - 如果不是,只需删除 XLSX 部分(你可以直接 csv_writer.writerows(expenses) ,而无需迭代个别行)。