2017-03-18 17 views
2

私はPythonスクリプトを書いて、.jsonファイルから文字列値を抽出し、いくつかの辞書に格納し、Open Pyxlを使って.xlsxファイルに書き出します。これは、時間:短い中Openpyxlで現在の行インデックスを取得する方法

は、それはそれのようになります。

は、私がその背景と前景の色を変更したいと思います(私はそれが正しい100%を確認していないが)

WORKBOOK = Workbook() 
WORKSHEET = WORKBOOK.active 
. . . 
. . . 
for PERSON in TEAM_LIST: 
    for ITEM in ITEMS[PERSON]: 
     if PERSON in REGULAR_LIST: 
      PERSON_ITEMS_ROW = (PERSON,ITEM[0],ITEM[1],ITEM[2],ITEM[3],ITEM[4)] 
      SHEET.append(PERSON_ITEMS_ROW) # Fill each row with some PERSON ITEMS 
     else: 
     PERSON_ITEMS_ROW = (PERSON,ITEM[0],ITEM[1],ITEM[2],ITEM[5],ITEM[6]) 
     SHEET.append(PERSON_ITEMS_ROW)  # Fill each row with other PERSON ITEMS 

このコードはうまく機能します上記の「else」の部分で選択した行のうち、私は実行する方法を見つけることができませんそれ ;

特定の色とフォントを特定の行に適用する方法を知っています。最初の行をヘッダー行として使用しますが、特定の色を適用できるように現在の行インデックスを取得する方法はわかりませんそして「他」セクション

任意のアイデアの各行のフォントはあなたがws._current_rowを探している

おかげ

答えて

-1

歓迎です。
ws._current_rowは、新しいセルを挿入した後にのみ有効です。

あなたは、インスタンスのためにそれを行うことができます。

... 
    SHEET.append(PERSON_ITEMS_ROW) 
    # For all cells in ws._current_row 
    for row_cells in ws.iter_rows(min_row=ws._current_row, max_row=ws._current_row): 
     for cell in row_cells: 
      cell.font = Font(color=colors.GREEN, italic=True) 

    # Only for cell in column A == 1 
    ws.cell(row=ws._current_row, column=1).font = Font(color=colors.RED) 

あなたはがサポートされていないws._current_rowを使用したくない場合は

# Assume you start in row==2 
    for ws_current_row, PERSON in enumerate(TEAM_LIST, 2): 
     #... 
     #SHEET.append(PERSON_ITEMS_ROW) 

     # For all cells in ws_current_row 
     for row_cells in ws.iter_rows(min_row=ws_current_row, max_row=ws_current_row): 
      for cell in row_cells: 
       cell.font = Font(color=colors.GREEN, italic=True) 

     # Only for cell in column A == 1 
     ws.cell(row=ws_current_row, column=1).font = Font(color=colors.RED) 

OOPソリューション、またはopenpyxlはそれを実装できます。例えば
:パイソンでテスト

from openpyxl.workbook.workbook import Workbook as _Workbook 
    from openpyxl.worksheet.worksheet import Worksheet as _Worksheet 

    class Worksheet(_Worksheet): 
     # Overload openpyxl.Worksheet.append 
     def append(self, iterable): 
      super().append(iterable) 
      return self._current_row, \ 
        self._cells_by_col(min_col=1, min_row=self._current_row, 
             max_col=self.max_column, max_row=self._current_row) 

    class Workbook(_Workbook): 
     # Workaround, as openpyxl is not using self.create_sheet(...) in __init__ 
     def __init__(self, write_only=True): 
      super().__init__(write_only) 
      self.__write_only = False 
      self.create_sheet() 

     # Not working for self.read_only and self.write_only : 
     # Overload openpyxl.Workbook.create_sheet 
     def create_sheet(self, title=None, index=None): 
      new_ws = Worksheet(parent=self, title=title) 
      self._add_sheet(sheet=new_ws, index=index) 
      return new_ws 

    for PERSON in TEAM_LIST: 
     # ... 
     ws_current_row, iter_col = SHEET.append(PERSON_ITEMS_ROW) 

     # Iterate all cells from generator iter_col 
     for cell in [col_cells[0] for col_cells in iter_col]: 
      cell.font = Font(color=colors.RED, italic=True) 

     # Only for cell in column A == 1 
     ws.cell(row=ws_current_row, column=1).font = Font(color=colors.BLUE) 

:3.4.2 - openpyxl:2.4.1 - LibreOfficeの:独自の内部使用を除き4.3.3.2
OpenPyXL Documentation

+0

この返信をありがとう、 それは動作します! (btw、2番目のws.current_rowにタイプミスがあります、 "_"がありません) 関連する質問: "_current_row"というオプション/属性/メソッドの使用方法を説明するドキュメントや、 ? Openpyxlは非常に強力ですが、私が書いたような単純なケースの明確な説明を見つけるにはいくつかの困難があります。多くのスクリプトの例では、行、列、セルの値がpythonスクリプトでハードコードされていますが、変数を使って得られた値はあまり多くありません。 よく、たぶん、私は十分に検索しませんでした... ;-) – bigstyx

+0

上記のコメントに改行を行う方法が見つからない:Shit + Enterは編集時に動作するように見えましたが、消えてしまいました... – bigstyx

+0

@ bigstyx:私の答えの一番下までドキュメントへのリンクを追加しました。そのような情報を得るための最良のソースはStackoverflowです。 – stovfl

0

、openpyxl 「現在の」行の概念はありません。あなたの場合、私はあなたが望んでいると思われるws.max_rowです。

関連する問題