找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3355|回复: 0

[讨论] 学习xlwt把数据传入Excel,在Excel中处理并画出图形

1

主题

17

帖子

17

积分

贫民

积分
17
蓝桥玄霜 发表于 2018-4-27 19:03:42 | 显示全部楼层 |阅读模式
本帖最后由 蓝桥玄霜 于 2018-4-27 19:07 编辑

我是小白,刚刚开始学习Python。
在Excelhome论坛看到一个讨论繁花图案的帖子,网上搜索到rmthy写的一个帖子,是用Python写的。
我复制了他的代码,生成了需要的数据;
摸索着我拼凑一小段代码,把这些数据写入Excel工作簿,然后,在Excel中处理这些数据,画出了繁花图案。
代码如下:
import math
import random

'''
功能:
    已知圆的圆心和半径,获取某弧度对应的圆上点的坐标
入参:
    center:圆心A
    radius:半径Ra
    radian:弧度
'''
defget_point_in_circle(center, radius, radian):
    return (center[0] + radius *math.cos(radian), center[1] - radius * math.sin(radian))

'''
功能:
    内外圆A和B,内圆A沿着外圆B的内圈滚动,已知外圆圆心、半径,已知内圆半径、公转弧度,已知

绕点半径,计算绕点坐标
入参:
    center_A:外圆圆心
    radius_A:外圆半径
    radius_B:内圆半径
    radius_C:绕点半径
    radian:公转弧度
'''
defget_point_in_child_circle(center_A, radius_A, radius_B, radius_C, radian):
    # 计算内圆圆心坐标
    center_B = get_point_in_circle(center_A,radius_A - radius_B, radian)
    # 计算绕点弧度(公转为逆时针,则自转为顺时针)
    radian_C = 2.0*math.pi - ((radius_A /radius_B * radian) % (2.0*math.pi))
    # 计算绕点坐标
    center_C = get_point_in_circle(center_B,radius_C, radian_C)
    center_B_Int = (int(center_B[0]),int(center_B[1]))
    return center_B_Int, center_C

''' 计算两点距离(平方和) '''
defget_instance(p1, p2):
    return (p1[0] - p2[0]) * (p1[0] - p2[0]) +(p1[1] - p2[1]) * (p1[1] - p2[1])

'''
功能:
    获取绕点路径的所有点的坐标
入参:
    center:外圆圆心
    radius_A:外圆半径
    radius_B:内圆半径
    radius_C:绕点半径
    shift_radian:每次偏移的弧度,默认0.01,值越小,精度越高,计算量越大
'''
defget_points(center_A, radius_A, radius_B, radius_C, shift_radian=0.01):
    # 转为实数
    radius_A *= 1.0
    radius_B *= 1.0
    radius_C *= 1.0

    P2 = 2*math.pi # 一圈的弧度为 2PI
    R_PER_ROUND = int(P2/shift_radian) + 1 # 一圈需要走多少步(弧度偏移多少次)

    # 第一圈的起点坐标
    start_center, start_point =get_point_in_child_circle(center_A, radius_A, radius_B,

radius_C, 0)
    points = [start_point]
    centers = [start_center]
    # 第一圈的路径坐标
    for r in range(1, R_PER_ROUND):
        center, point =get_point_in_child_circle(center_A, radius_A, radius_B, radius_C,

shift_radian*r)
        points.append(point)
        centers.append(center)

    # 以圈为单位,每圈的起始弧度为 2PI*round,某圈的起点坐标与第一圈的起点坐标距离在一定范围内,认为路径结束
    for round in range(1, 100):
        s_radian = round*P2
        s_center, s_point =get_point_in_child_circle(center_A, radius_A, radius_B,

radius_C,s_radian)
        if get_instance(s_point, start_point)< 0.1:
            break
        points.append(s_point)
        centers.append(s_center)
        for r in range(1, R_PER_ROUND):
            center, point =get_point_in_child_circle(center_A, radius_A, radius_B,

radius_C,s_radian + shift_radian*r)
            points.append(point)
            centers.append(center)

    print(len(points)/R_PER_ROUND)

    return centers, points


center = (300,200)  ‘大圆的圆心坐标
radius_A = 150     ‘大圆的半径
radius_B = 110     ‘小圆的半径
radius_C = 50      ‘绕点半径

test_centers,test_points = get_points(center, radius_A, radius_B, radius_C)

导入Excel的代码:
from xlwtimport *

wb = Workbook()
ws =wb.add_sheet('A Test Sheet')
sj= test_points   ‘sj为列表,test_points是另外程序得到的数据

for i inrange(0,len(sj)):
    ws.write(i, 0, label=str(sj))   ‘转为字符串

wb.save('E:\sj1.xls')

在Excel中处理数据,并画图。
Sub lqxs()
'处理数据
Dim Arr, Brr, i&, aa
Arr = [A1].CurrentRegion
ReDim Brr(1 To UBound(Arr), 1 To 2)
For i = 1 To UBound(Arr)
    aa = Mid(Arr(i, 1), 2, Len(Arr(i, 1)) - 2)
    Brr(i, 1) = Split(aa, ",")(0)
    Brr(i, 2) = Split(aa, ",")(1)
Next
[e1].Resize(UBound(Brr), 2) = Brr
End Sub

Sub fanhua2()
'画图
    Dim Arr, i&, shp As Shape
    Application.ScreenUpdating = False
    For Each shp In ActiveSheet.Shapes
        If shp.Type = 9 Then shp.Delete
    Next
    Application.ScreenUpdating = True
    Arr = [e1].CurrentRegion
        x1 = Arr(2, 1)
        y1 = Arr(2, 2)
    For i = 2 To UBound(Arr)
        x2 = Arr(i, 1)
        y2 = Arr(i, 2)
        Set shp = ActiveSheet.Shapes.AddLine(x1, y1, x2, y2)
        shp.Line.ForeColor.RGB = RGB(255, 0, 0): shp.Width = 1

        x1 = x2
        y1 = y2
   Next
End Sub


2018-4-27fh2.png
2018-4-27繁花.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表