2016-05-12 2 views
1

私は(私は、文書内の一部の行のスタイル機能を必要とする)xlsxwriterでCSVファイルを置き換えるためにしようとしているので、私はxlsxwriterでこのロジックを再実装しようとしている:正確な行がないxlsxwriterを繰り返し使用してデータを書き込む方法:列座標?

xlsxwriterを使用してそれを実装する方法
with open('text.csv', 'wb') as file_csv: 
     fieldnames = ["Date", "Advertiser", "Offer", "Affiliate", "Affiliate Source", "Impressions", "Clicks", "Cost click", "Conversions", "Cost", "Revenue", "Profit", "Real profit"] 
     writer = csv.DictWriter(file_csv, delimiter=",", fieldnames=fieldnames) 
     writer.writeheader() 
     for d in data: 
      real_profit = str(float(d['Stat']['profit']) - (int(d['Stat']['clicks']) * 0.0004)) 
      writer.writerow({"Date": d['Stat']['date'], "Advertiser": d['Advertiser']['company'], "Offer": d['Offer']['name'], "Affiliate": d['Affiliate']['company'], "Affiliate Source": d['Stat']['source'], "Impressions": d['Stat']['impressions'], "Clicks": d['Stat']['clicks'], "Cost click": str(int(d['Stat']['clicks']) * 0.0004), "Conversions": d['Stat']['conversions'], "Cost": d['Stat']['payout'], "Revenue": d['Stat']['revenue'], "Profit": d['Stat']['profit'], "Real profit": real_profit}) 
     totals = response['data']['totals']['Stat'] 
     writer.writerow({"Date": "Totals", "Impressions": totals['impressions'], "Clicks": totals['clicks'], "Conversions": totals['conversions'], "Cost": totals['payout'], "Revenue": totals['revenue'], "Profit": totals['profit']}) 

反復的にforループで最後に合計行を書く?

答えて

3

DictWriterは、配列fieldnamesからcol番号をルックアップするための単なるラッパーです。あなたは、このような自分でラッパー書くことができます。

class DictWriter: 
    def __init__(self, worksheet, fieldnames): 
    self.worksheet =worksheet 
    self.fieldnames = fieldnames 
    self.nrow = 1 

    def writerow(self, d): 
    for k in d: 
     ncol = self.fieldnames.index(k) 
     self.worksheet.write(self.nrow, ncol, d[k]) 
    self.nrow += 1 

    def writeheader(self): 
    for ncol , fieldname in enumerate(self.fieldnames): 
     self.worksheet.write(0, ncol, fieldname) 

使用法:

import xlsxwriter 

workbook = xlsxwriter.Workbook('test.xlsx') 
worksheet = workbook.add_worksheet() 
fieldnames = [...] 
writer = DictWriter(worksheet, fieldnames) 
writer.writeheader() 

# below comes your code 
for d in data: 
    real_profit = str(float(d['Stat']['profit']) - (float(d['Stat']['clicks']) * 0.0004)) 
    writer.writerow({"Date": d['Stat']['date'], "Advertiser": d['Advertiser']['company'], "Offer": d['Offer']['name'], "Affiliate": d['Affiliate']['company'], "Affiliate Source": d['Stat']['source'], "Impressions": d['Stat']['impressions'], "Clicks": d['Stat']['clicks'], "Cost click": str(int(d['Stat']['clicks']) * 0.0004), "Conversions": d['Stat']['conversions'], "Cost": d['Stat']['payout'], "Revenue": d['Stat']['revenue'], "Profit": d['Stat']['profit'], "Real profit": real_profit}) 
+0

私は内の行を記述するためのwriterowメソッドにフィールド名二時間を渡すべきでしょうか? – paus

+0

いいえ、あなたは 'fieldname'が既に' writer'オブジェクトに保存されているので、そうしないでください。 – gdlmx

+0

しかし、変数はどういう意味ですか?オブジェクトの作成中に何らかの形で初期化されるかどうか – paus

関連する問題