Python - 读取由分号分隔的文本文件,使用openpyxl绘制图表

时间:2017-07-02 17:18:24

标签: python-2.7 openpyxl

我已将文本文件复制到excel工作表,用;分隔符分隔单元格。

我需要使用我实现的相同文件绘制图表。由于复制的所有值均为type=str,因此我的图表会给出错误的点。

请建议克服这一点。 Plot应该由int值

组成
from datetime import date
from openpyxl import Workbook,load_workbook
from openpyxl.chart import (
    LineChart,
    Reference,
    Series,
)
from openpyxl.chart.axis import DateAxis
excelfile = "C:\Users\lenovo\Desktop\how\openpychart.xlsx"
wb = Workbook()
ws = wb.active

f = open("C:\Users\lenovo\Desktop\sample.txt")
data = []
num = f.readlines()
for line in num:
    line = line.split(";")
    ws.append(line)
f.close()
wb.save(excelfile)
wb.close()

wb = load_workbook(excelfile, data_only=True)
ws = wb.active

c1 = LineChart()
c1.title = "Line Chart"
##c1.style = 13
c1.y_axis.title = 'Size'
c1.x_axis.title = 'Test Number'

data = Reference(ws, min_col=6, min_row=2, max_col=6, max_row=31)
series = Series(data, title='4th average')
c1.append(series)

data = Reference(ws, min_col=7, min_row=2, max_col=7, max_row=31)
series = Series(data, title='Defined Capacity')
c1.append(series)

##c1.add_data(data, titles_from_data=True)

# Style the lines
s1 = c1.series[0]
s1.marker.symbol = "triangle"
s1.marker.graphicalProperties.solidFill = "FF0000" # Marker filling
s1.marker.graphicalProperties.line.solidFill = "FF0000" # Marker outline

s1.graphicalProperties.line.noFill = True

s2 = c1.series[1]
s2.graphicalProperties.line.solidFill = "00AAAA"
s2.graphicalProperties.line.dashStyle = "sysDot"
s2.graphicalProperties.line.width = 100050 # width in EMUs

##s2 = c1.series[2]
##s2.smooth = True # Make the line smooth

ws.add_chart(c1, "A10")
##
##from copy import deepcopy
##stacked = deepcopy(c1)
##stacked.grouping = "stacked"
##stacked.title = "Stacked Line Chart"
##ws.add_chart(stacked, "A27")
##
##percent_stacked = deepcopy(c1)
##percent_stacked.grouping = "percentStacked"
##percent_stacked.title = "Percent Stacked Line Chart"
##ws.add_chart(percent_stacked, "A44")
##
### Chart with date axis
##c2 = LineChart()
##c2.title = "Date Axis"
##c2.style = 12
##c2.y_axis.title = "Size"
##c2.y_axis.crossAx = 500
##c2.x_axis = DateAxis(crossAx=100)
##c2.x_axis.number_format = 'd-mmm'
##c2.x_axis.majorTimeUnit = "days"
##c2.x_axis.title = "Date"
##
##c2.add_data(data, titles_from_data=True)
##dates = Reference(ws, min_col=1, min_row=2, max_row=7)
##c2.set_categories(dates)
##
##ws.add_chart(c2, "A61")


### setup and append the first series
##values = Reference(ws, (1, 1), (9, 1))
##series = Series(values, title="First series of values")
##chart.append(series)
##
### setup and append the second series
##values = Reference(ws, (1, 2), (9, 2))
##series = Series(values, title="Second series of values")
##chart.append(series)
##
##ws.add_chart(chart)
wb.save(excelfile)
wb.close()

enter image description here

1 个答案:

答案 0 :(得分:0)

我在for循环中修改了以下代码,但它确实有效。

    f = open("C:\Users\lenovo\Desktop\sample.txt")
    data = []
    num = f.readlines()

    for line in num:
        line = line.split(";")
        new_line=[]
        for x in line:
            if x.isdigit():
                x=int(x)
                new_line.append(x)
            else:
                new_line.append(x)
        ws.append(new_line)
    f.close()
    wb.save(excelfile)
    wb.close()

对于每个列表,对于每个值,检查它是否为数字,如果是,则转换为整数并存储在另一个列表中。

使用x = map(int,x)也没有用,因为我也有字符值。 我觉得上面比使用try和Except

使用x = map(int,x)要容易得多

由于 巴沙