[Python]openpyxlライブラリでExcelのシートへ設定

前の記事で、以下のコード部分がopenpyxlライブラリでExcelワークシートを作っているところです。 ws は「ワークシート」であります。


import openpyxl

wb = openpyxl.Workbook()
ws = wb.active

こいつにいろいろ頼むと列幅変えたり、罫線引いたりできるのであります。例えば列幅設定は以下のコードになります。


ws.column_dimensions['A'].width = 5
ws.column_dimensions['B'].width = 13
ws.column_dimensions['C'].width = 13

印刷関係の設定も以下のように楽々です。


from openpyxl.workbook import Workbook

ws.print_title_rows = '1:1'
ws.oddFooter.center.text = "&[Page] / &N ページ"
ws.oddHeader.center.text = "一覧表"
ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE
ws.page_setup.fitToWidth = 1
ws.page_setup.fitToHeight = 0
ws.sheet_properties.pageSetUpPr.fitToPage = True

上の設定でやっているのは。以下の通り。

  • 1行目を印刷のときのヘッダ行として毎ページ出す
  • フッターへ ページNo.を出す
  • ヘッダーに「一覧表」という文字列を出す
  • 用紙を横向きに
  • 印刷の時、横1ページ、縦は複数ページで印刷する

よくExcelの印刷設定で見るやつです。

PythonでExcelを読み書きして何が嬉しいかというと、データを取り込んじゃえばPythonのデータ構造とか言語仕様の世界ですっきりプログラムが書けるってところかなと思います。VBAは不得意なので…

 

 

広告

[Python] CSVファイルをExcelファイルへ

今年はPython3を勉強年間なので、お仕事でも使えるCSVをExcelファイルへ変換するのを作って見ました。これをベースに、Redmineチケット一覧をCSVに吐いてレポート作成とかいうところで使えるツールを整備中。印刷設定(ヘッダ、フッタ、行見出し、印刷倍率)とか、枠線つけたりとかもできるようになってきてます。

Python3とopenpyxlというライブラリがあれば、Excelが導入されていないUNIX機でもExcelファイル(xlsx)が作成できる優れもののライブラリを使ってます。ちょっと公式ドキュメントの例が少ないんですけど。

[Ruby]ファイル名からブランクを削除

Python版のプログラムと同じことができるRubyスクリプトを書いてみた。
私のPythonスキルの無さのせいだと思うけど、Rubyの方がスッキリ書けた。


なんか、もうコールバック関数とかやらなくてイイヨ的な感じになった。
そういう感じになったのはきっとPythonっぽいプログラムが書けてないんだろうなぁ…

 

 

Raspberry Pi2 で AirPlayしたい(実装編)

前回、調査編を書いて実装編(というほどのもんでもないか…)を書いてませんでした。

結局、下のUSB-オーディオ変換をRaspberry Pi2 へ装着して、AirPlayを実現していたのでした。

ちなみに参考サイトはこちら…

https://www.lifehacker.jp/2013/03/130306raspberry_piairplay.html

shairportっていうAirPlayのソフトを入れて、Raspberry Pi2で起動すると MacとかiPhoneのAirPlay機器として出てくるんで、出力先として指定するだけです。

たまに、変になるけど、Raspberry Pi2にsshで入って /etc/init.d/shairport restart をすればOK。^^);;

これでわりと安価に快適なAirPlay環境かでできました。

 

XMLを小綺麗にして比較

結局、XMLは文字列なんだから小綺麗にフォーマットして文字列比較でいいぢゃないか。
ということに気がついた。以下は例…

  • test1.xmlとtest2.xmlを準備した。
  • test2.xmlはちょっと形式を汚くしたもの。(ムダな空白を入れた)
  • 単純切り出しだと比較はNGになる
  • フォーマットした文字列を比較すれば同一として判断される

⬜︎test1.xml

 <root>
    <a name="a1">
        <b>bbb1</b>
        <b>bbb2</b>
        <b>bbb3</b>
        <c>ccc1</c>
    </a>
    <a>
        <b>bbb4</b>
        <b>bbb5</b>
    </a>
    <a name="a3" price="100"></a>
</root>

⬜︎test2.xml

 <root>
    <a name="a1">
        <b>bbb1</b>
            <b>bbb2</b>
        <b>bbb3</b>
        <c>ccc1</c>
    </a>
    <a>
        <b>bbb4</b>
        <b>bbb5</b>
    </a>
    <a name="a3" price="100"></a>
</root>

⬜︎Rubyスクリプト

require 'rexml/document'
require 'stringio'

default_formatter = REXML::Formatters::Pretty.new

doc1 = REXML::Document.new(open("test1.xml"))
doc2 = REXML::Document.new(open("test2.xml"))

puts "#test1.xml------------------"
puts doc1.elements['root/a[1]']
puts "----------------------------"
output1 = StringIO.new
default_formatter.write(doc1.elements['root/a[1]'], output1)
puts output1.string
puts "----------------------------"

puts "#test2.xml------------------"
puts doc2.elements['root/a[1]']
puts "----------------------------"
output2 = StringIO.new
default_formatter.write(doc2.elements['root/a[1]'], output2)
puts output2.string
puts "----------------------------"

puts "non-formatted : " + (doc1.elements['root/a[1]'] == doc2.elements['root/a[1]'] ? "OK" : "NG")
puts "formatted : " + (output1.string == output2.string ? "OK" : "NG")

フォーマット前だと別文字列となったが、フォーマットしたら同じ文字列と判断された。
これで比較はいいぢゃんと思った。

XMLを比較したい

XMLを比較したいと思っている。まだ回答は自分の中に無い。「作りたいなぁ」って感じ。

 <root>
  <aa>
    <param>i 1</param>
    <Data>
      <AA>full</AA>
      <shut/>
    </Data>
  </aa>
  <aa>
  <param>i 2</param>
  <Data>
    <AA>full</AA>
  </Data>
  </aa>
  <bb>
    <CC></CC>
  </bb>
</root>

<root>タグの配下に<aa>とか<bb>とかのタグがある。この単位に比較したい。
<aa>ってタグが複数出てくるけど、1つ目は<shut/>されていたりする。
これが変更されて、<shut/>がなくなったりすると最初の<aa>〜</aa>を差分として切り出したい。
言語はなんでもいいんだけど、Rubyが最近読みやすいのでRubyで作ってみたい。