<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          openpyxl 追加 Excel 數(shù)據(jù)與 Excel 畫像素畫

          共 5232字,需瀏覽 11分鐘

           ·

          2021-02-23 11:44

          你好,我是悅創(chuàng)。

          本篇文章所涉及代碼文件關(guān)注公眾號:AI悅創(chuàng),后臺回復(fù):20210222

          xlsxwriter 只能創(chuàng)建新的文件,不能對文件進行數(shù)據(jù)的追加和讀取操作。

          需要追加和讀取 xlsx 文件,就需要用到 openpyxl 這個庫了。安裝命令:pip install openpyxl。使用 openpyxl 完成這面這個需求:

          • 讀取上面創(chuàng)建好的 xlsxwriter 插入數(shù)據(jù)和折線圖.xlsx 文件,復(fù)制一份,保存到 poenpyxl 插入數(shù)據(jù)和折線圖[copy xlsxwriter].xlsx 復(fù)制的文件中
          • sheet1 保持和源文件的 sheet1 一致,折線圖不畫復(fù)制的文件中
          • 創(chuàng)建一個 sheet2,sheet2 的數(shù)據(jù)從 sheet1 中拷貝過來
          • 隨機的增加 1 年的隨機數(shù)據(jù),也就是 ?2020年1月至12月的日期,數(shù)據(jù)1 和數(shù)據(jù)2 的 12 個數(shù)據(jù)隨機生成
          • 在 sheet2 中畫一個折線圖,統(tǒng)計數(shù)據(jù)1 和數(shù)據(jù)2

          需求有四個,有難有易。

          拷貝文件

          第一個是拷貝文件和 sheet1

          其實拷貝了文件,自然就包含sheet1,最簡單了,如下代碼:

          import openpyxl
          filename = 'xlsxwriter插入數(shù)據(jù)和折線圖.xlsx'
          wb = openpyxl.load_workbook(filename)
          wb.save('poenpyxl插入數(shù)據(jù)和折線圖[copy xlsxwriter].xlsx')

          這樣就得到了源文件和 sheet1 的復(fù)制品。

          拷貝 sheet 內(nèi)容

          第二個需求,拷貝sheet1,做成sheet2

          也簡單,如下代碼:

          import openpyxl
          filename = 'xlsxwriter插入數(shù)據(jù)和折線圖.xlsx'
          wb = openpyxl.load_workbook(filename)

          sheet1 = wb['sheet1']
          sheet2 = wb.copy_worksheet(sheet1)
          sheet2.title = "sheet2"

          wb.save('poenpyxl插入數(shù)據(jù)和折線圖[copy xlsxwriter].xlsx')

          獲取 sheet1,復(fù)制一個給 sheet2 ?參數(shù),然后改下 ?sheet2 的標(biāo)題 title,這個 ?title 就是文件的 sheet2 的名字。

          追加數(shù)據(jù)內(nèi)容

          第三個需求,sheet2 中,數(shù)據(jù)1 和數(shù)據(jù)2 追加一年的數(shù)據(jù),數(shù)據(jù)可以隨意生成

          貌似簡單,但是年份時間不好計算,并且現(xiàn)在只有 2019 年的。如果之前數(shù)據(jù)是 2018 年,則追加一年,應(yīng)該是 2019 年,所以要讀取時間和月份追加。

          這里的難點就是時間字符串的讀取,以及字符串轉(zhuǎn)時間,以及時間的相加。如下實現(xiàn)代碼:

          import openpyxl, random, datetime
          from dateutil.relativedelta import relativedelta
          filename = 'xlsxwriter插入數(shù)據(jù)和折線圖.xlsx'
          wb = openpyxl.load_workbook(filename)

          sheet1 = wb['sheet1']
          sheet2 = wb.copy_worksheet(sheet1)
          sheet2.title = "sheet2"

          rows = sheet2.max_row # 讀取最后一行
          prev_date_str = sheet2.cell(row=rows,column=1).value # 取出時間的字符串
          prev_date = datetime.datetime.strptime(prev_date_str, "%Y-%m") # 時間字符串轉(zhuǎn)時間對象
          for i in range(1,13):
          tmp_date = prev_date + relativedelta(months=i) # 月份的計算,每次增加一個月,就得到了第二年的12個月
          tmp_num1 = random.randint(1,100)
          tmp_num2 = random.randint(1,100)
          sheet2.append([tmp_date.strftime("%Y-%m"), tmp_num1, tmp_num2])

          wb.save('poenpyxl插入數(shù)據(jù)和折線圖[copy xlsxwriter].xlsx')

          實現(xiàn)思路:

          • 讀取出最后一行
          • 取出時間字符串,然后轉(zhuǎn)換成時間對象
          • 一年 12 個月,循環(huán) 12 次,每次增加一個月,數(shù)值可以隨機的生成,用 random 即可
          • 數(shù)據(jù)的追加,是按每行,所以將【時間, 數(shù)據(jù)1, 數(shù)據(jù)2】通過 append 直接追加到數(shù)據(jù)最后即可

          第三個需求搞定,下一個需求,sheet2 畫折線圖

          使用 openpyxl 畫圖表

          第四個需求,在 sheet2 中對全部數(shù)據(jù)畫折線圖

          這個難度不大,只要知道 openpyxl 的畫圖工具即可,如下代碼:

          import openpyxl, random, datetime
          from dateutil.relativedelta import relativedelta
          filename = 'xlsxwriter插入數(shù)據(jù)和折線圖.xlsx'
          wb = openpyxl.load_workbook(filename)

          sheet1 = wb['sheet1']
          sheet2 = wb.copy_worksheet(sheet1)
          sheet2.title = "sheet2"

          rows = sheet2.max_row
          prev_date_str = sheet2.cell(row=rows,column=1).value
          prev_date = datetime.datetime.strptime(prev_date_str, "%Y-%m")
          for i in range(1,13):
          tmp_date = prev_date + relativedelta(months=i)
          tmp_num1 = random.randint(1,100)
          tmp_num2 = random.randint(1,100)
          sheet2.append([tmp_date.strftime("%Y-%m"), tmp_num1, tmp_num2])

          # 下面是畫折線圖的實現(xiàn)代碼
          from openpyxl.chart import Series,LineChart, Reference
          chart = LineChart() #圖表對象
          rows = sheet2.max_row

          data1 = Reference(sheet2, min_col=2, min_row=1, max_col=2, max_row=rows) #涉及數(shù)據(jù)
          title1 = sheet2.cell(row=1,column=2).value
          seriesObj1 = Series(data1, title=title1) #創(chuàng)建series對象

          data2 = Reference(sheet2, min_col=3, min_row=1, max_col=3, max_row=rows) #涉及數(shù)據(jù)
          title2 = sheet2.cell(row=1,column=3).value
          seriesObj2 = Series(data2, title=title2) #創(chuàng)建series對象

          chart.append(seriesObj1) #添加到chart中
          chart.append(seriesObj2) #添加到chart中

          sheet2.add_chart(chart, "E3") #將圖表添加到 sheet中


          wb.save('poenpyxl插入數(shù)據(jù)和折線圖[copy xlsxwriter].xlsx')

          導(dǎo)入所需的畫圖工具,圖表初始化,然后生成數(shù)據(jù)對象:

          • data1 的生成,因為索引從1 開始,所以標(biāo)題是第一行第二列,數(shù)據(jù)是第二行第二列,一直到最后一行第二列
          • data2 的生成,因為索引從1開始,所以標(biāo)題是第一行第三列,數(shù)據(jù)是第二行第三列,一直到第二行最后三列
          • 將兩個數(shù)據(jù)都放到圖表內(nèi)
          • 然后圖表的開始位置,設(shè)置成 E3,數(shù)據(jù)在 ABC,E 是空的,3 距離頂部有兩格的位置

          最后文件保存,大功告成。

          查看最后的效果圖

          然后就是用 Office 打開 poenpyxl 插入數(shù)據(jù)和折線圖 [copy xlsxwriter].xlsx,看下 ?sheet2 的樣子,如下圖:

          25 行數(shù)據(jù),除了標(biāo)題 24 行,剛好是 2019+2020 的 24 個月。折線圖也一切正常。

          Excel 畫像素畫

          Excel 和圖片類似

          Excel 文件,單元格支持編輯內(nèi)容和設(shè)置背景色。

          一張圖片,都是由密密麻麻的像素組成,且每個像素都是一個 rgb 的顏色值。

          那是否可以讀取圖片每個像素的顏色,填充到 Excel 中,就可以做到 Excel 中畫圖。

          這么想,是可以的。理論上也是可行的,那接下來就開始寫代碼。

          打開文件和圖片

          第一步,導(dǎo)入所需庫,分別是 xlsxwriter 和圖片的 ?Image 庫。使用 xlsxwriter 的理由,是 xls 內(nèi)容有限,圖片的像素可是很多的,所以最好是使用 xlsx 格式。

          import xlsxwriter
          from PIL import Image

          導(dǎo)入之后,準(zhǔn)備圖片,并讀取圖片的寬高,以及像素對象:

          path = '1.png'
          img = Image.open(path)
          imgL = img.convert("P").convert("RGB")
          pix = imgL.load()
          w, h = imgL.size
          image.png

          使用 Image 讀取圖片對象,獲取寬和高,以及 pix 這像素對象,通過 pix[1,1 ]拿到具體的顏色 RGB 值,然后轉(zhuǎn)換成 16 進制的顏色值,進行背景色的寫入。

          準(zhǔn)備一個特殊函數(shù)

          現(xiàn)在打開一個 xlsx 文件,文件名任意,如下代碼:

          wb = xlsxwriter.Workbook('demo2.xlsx')
          ws = wb.add_worksheet('sheet1')

          然后找一個 RGB 轉(zhuǎn) 16 進制的函數(shù),因為 RGB 是 10 進制的,方式就是通過 hex 函數(shù)轉(zhuǎn)換成 16 ?進制,然后加上 x ?和 0,并全部大寫,就可以了。如下函數(shù):

          def RGB_to_Hex(tmp):
          rgb = list(tmp)
          strs = '#'
          for i in rgb:
          num = int(i)
          strs += str(hex(num))[-2:].replace('x','0').upper()
          return strs

          「為什么一定要 ? 16 ?進制?」 因為 ?sheet 中,寫入背景色時,顏色必須是 16 進制才可以。

          讀取和寫入

          下面就是循環(huán)的逐個單元格設(shè)置背景色,且不需要寫入內(nèi)容。如下代碼:

          for i in range(w):
          for j in range(h):
          rgb = pix[i,j]
          color = RGB_to_Hex(rgb)
          style = wb.add_format({'bg_color': '{}'.format(color)})
          ws.write(j,i,'',style)
          ws.set_row(j,1)
          ws.set_column(0,w-1,0.5)

          wb.close()

          代碼思路:

          • 循環(huán)讀取寬和高,讀取到全部的分辨率節(jié)點
          • 然后通過 pix 讀取指定 x,y 的 RGB 值,再轉(zhuǎn)換成 16 進制的內(nèi)容
          • 設(shè)置 style 樣式,顏色值就是轉(zhuǎn)換之后的 ?16 進制
          • 然后寫入單元格,內(nèi)容是空,顏色背景是 style
          • 循環(huán)內(nèi)也要設(shè)置當(dāng)前單元格的行高
          • 循環(huán)外,統(tǒng)一設(shè)置單元格的寬度

          這是單元格的主要代碼,寫完后,關(guān)閉 workbook 即可。

          查看像素畫

          讀取圖片的全部寬高,然后描繪到 ?Excel 中完成了。最后用圖片的形式展示下文件的樣子,如下圖【使用 ?WPS 軟件查看】:

          image.png


          長按識別下方二維碼,和眾多位島民一起

          把別人的頓悟,變成你的基本功


          ?花半秒鐘就看透事物本質(zhì)的人,
          ? 和花一輩子都看不清的人,
          ? 注定是截然不同的命運。

          瀏覽 41
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一道本一区二区三区久久久久 | 国产成人主播精品视频 | 暴肏美女视频在线观看 | 五月天综合网 | 青青草视频国产 |