单元格对象是工作表对象的子对象,使用单元格对象的属性和方法可以对它进行设置和修改。[大谦Excel,dqexcel点com]
单元格的引用和赋值
单元格的引用,是指在工作表中找到要进行操作的单元格。可用多种方法实现单元格的引用。
第1种方式使用方括号,用单元格的行列坐标进行引用。
>>> ws["A1"]=123
>>> ws["B2"]="你好"
>>> cl=ws["A1"]
第2种方式是使用工作表对象的cell方法返回一个Cell对象,然后利用该对象的属性方法等进行操作。
>>> cl = ws.cell(row=4, column=2, value=10)
这里,cell方法返回一个新的Cell对象cl,其行号为4,列号为2,值为10。
第3种方式是导入cell模块,然后用其中的Cell方法返回一个Cell对象。
>>> from openpyxl.cell import cell
>>> cl=cell.Cell(worksheet=ws, row=4, column=2, value=10)
Cell对象的主要属性和方法有:
>>> cl=ws["C3"]
>>> cl.row #单元格的行号
3
>>> cl.column #单元格的列号
3
>>> cl.value #单元格中的值
'李广'
>>> cl.coordinate #单元格的坐标
'C3'
>>> cl.data_type #单元格中值的数据类型
's'
>>> cl.hyperlink.ref="https:\\www.baidu.com" #单元格的链接
>>> cl.hyperlink
<openpyxl.worksheet.hyperlink.Hyperlink object>
Parameters:
ref='https:\\www.baidu.com', location=None, tooltip=None, display=None, id=None
>>> h=cl.offset(row=1, column=2) #偏移一定位置(下1行右2列)后的单元格
>>> h.value
79
单元格区域的引用
给定区域左上角和右下角单元格的坐标,使用坐标引用单元格区域。
>>> cr=ws["A1:C4"]
>>> cr=ws["A1":"C4"]
>>> cr
((<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>), (<Cell 'Sheet'.A2>,
<Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>), (<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>,
<Cell 'Sheet'.C3>), (<Cell 'Sheet'.A4>, <Cell 'Sheet'.B4>, <Cell 'Sheet'.C4>))
所以,采用坐标引用方式返回的是一个二维元组。可以用下面的引用方式获取元组中元素的值。
>>> cr[2][2].value
'李广'
行和列的引用请参见2.2.5小节的内容。
另外,可以用CellRange对象表示单元格区域。
>>> from openpyxl.worksheet import cell_range as cr
>>> cr0=cr.CellRange(min_row=2,max_row=5,min_col=3,max_col=6)
CellRange对象的属性和方法主要有:
>>> cr0.bottom #区域底部一行各单元格的坐标
[(5, 3), (5, 4), (5, 5), (5, 6)]
>>> cr0.top #区域顶部一行各单元格的坐标
[(2, 3), (2, 4), (2, 5), (2, 6)]
>>> cr0.left #区域左侧一列各单元格的坐标
[(2, 3), (3, 3), (4, 3), (5, 3)]
>>> cr0.right #区域右侧一列各单元格的坐标
[(2, 6), (3, 6), (4, 6), (5, 6)]
>>> cr0.min_row #区域最小行号
2
>>> cr0.min_col #区域最小列号
3
>>> cr0.max_row #区域最大行号
5
>>> cr0.max_col #区域最大列号
6
>>> cr0.size #区域大小
{'columns': 4, 'rows': 4}
>>> cr0.bounds #区域左上角和右下角单元格坐标
(3, 2, 6, 5)
>>> cr0.coord #区域左上角和右下角单元格坐标
'C2:F5'
>>> for cell in cr0.rows: #区域各行单元格的坐标
cell
[(2, 3), (2, 4), (2, 5), (2, 6)]
[(3, 3), (3, 4), (3, 5), (3, 6)]
[(4, 3), (4, 4), (4, 5), (4, 6)]
[(5, 3), (5, 4), (5, 5), (5, 6)]
>>> for cell in cr0.cols: #区域各列单元格的坐标
cell
[(2, 3), (3, 3), (4, 3), (5, 3)]
[(2, 4), (3, 4), (4, 4), (5, 4)]
[(2, 5), (3, 5), (4, 5), (5, 5)]
[(2, 6), (3, 6), (4, 6), (5, 6)]
>>> for cell in cr0.cells: #区域内个单元格的坐标
cell
(2, 3)
(2, 4)
(2, 5)
(2, 6)
(3, 3)
(3, 4)
(3, 5)
(3, 6)
(4, 3)
(4, 4)
(4, 5)
(4, 6)
(5, 3)
(5, 4)
(5, 5)
(5, 6)
单元格区域的操作
使用工作表大小的move_range方法移动指定区域。该方法的第一个参数表示要移动的区域;rows参数定义上下方向的移动幅度,值大于0时表示向下移动,小于0时表示向上移动;cols参数定义左右方向的移动幅度,值大于0时表示向右移动,小于0时表示向左移动。
下面将区域D4:F10向上移动一行,向右移动两列。
>>> ws.move_range("D4:F10", rows=-1, cols=2)
使用嵌套的for循环遍历区域内的单元格:
>>> for row in ws["C3:D5"]:
for cell in row:
print(cell.value)
使用工作表对象的merge_cells方法可以合并区域,使用unmerge_cells方法解除合并。下面合并C3:E4区域:
>>> ws.merge_cells("C3:E4")
>>> wb.save("test.xlsx")
合并后的效果如图3-6所示。可见,合并单元格时,除左上角单元格外,所有单元格都将从工作表中删除,包括其中的内容也被删除。
图3-6 合并单元格
下面用unmerge_cells方法解除合并:
>>> ws.unmerge_cells(“C3:E4”)
>>> wb.save(“test.xlsx”)
解除合并以后,原来被删除的单元格被恢复,但是里面的数据无法恢复。
使用merge_cells和unmerge_cells方法时,也可以用参数指定区域的坐标,例如:
>>> ws.merge_cells(start_row=3, start_column=3, end_row=4, end_column=5)
>>> ws.unmerge_cells(start_row=3, start_column=3, end_row=4, end_column=5)
注意:对于没有合并过的单元格调用 unmerge_cells 方法时会报错。
单元格样式
OpenPyXL 用6个类模块来设置单元格的样式:
• NumberFormat 数字
• Font 字体
• Alignment 对齐
• PatternFill 填充
• Border 边框
• Protection 保护
使用它们之前,必须先从openpyxl.styles中导入它们:
>>> from openpyxl.styles import numbers,Font, Alignment
>>> from openpyxl.styles import PatternFill, Border, Side, Protection
下面以用Font类设置单元格和区域的字体为例,介绍样式的设置。
假设设置的字体样式为字体加粗。首先导入Font类模块,创建一个定义字体加粗的Font对象font。
>>> from openpyxl.styles import Font
>>> font = Font(bold=True)
设置单个单元格的字体,将刚才创建的font对象赋给Cell对象cl的font属性:
>>> cl=ws["C3"]
>>> cl.font=font
遍历区域内的单元格,设置区域的字体:
>>> for row in ws["A1:C3"]:
for cell in row:
cell.font = font
设置第1行的字体:
>>> row = ws.row_dimensions[1]
>>> row.font = font
设置第1列的字体:
>>> column = ws.column_dimensions["A"]
>>> column.font = font
一、设置字体
创建字体Font对象,可以定义字体的名称、大小、是否加粗、是否倾斜等属性。主要参数及其说明如下:
• name 字体名称
• size 字体大小
• color 字体颜色
• bold 字体是否加粗
• italic 字体是否倾斜
• underline 下划线设置,值为"none", "single"或"double"
• strike 字体是否添加删除线
• strikethrough 字体是否添加删除线
• vertAlign 上标下标设置,值为"superscript", "subscript"或"baseline"
下面创建一个Font对象font,并用于定义单元格C3的字体。
>>> font = Font(name="Arial", size=12, bold=True, italic=True, underline="single", strike=False, color="FF0000")
>>> ws.cell(row=3, column=3).font=font
>>> wb.save("test.xlsx")
A3单元格字体设置的效果如图3-7所示。
图3-7 设置字体
二、设置颜色
OpenPyXL中设置颜色有三种方式,包括RGB颜色、索引着色和主题颜色等。上面设置字体时,给color参数设置了一个十六进制RGB值,可以是
>>> font = Font(color="00FF0000")
这里RGB值一共有8位,定义4个颜色分量,即透明度、红色分量、绿色分量和兰色分量。也可以是
>>> font = Font(color="FF0000")
不定义透明度,只有R, G, B三个分量。
也可以使用colors模块中的Color类创建一个Color对象,然后利用它设置颜色:
>>> from openpyxl.styles.colors import Color
设置RGB颜色,使用rgb参数。
>>> c = Color(rgb="00FF00") #RGB颜色
>>> font = Font(color=c)
所谓索引着色,首先有一张颜色查找表,表中预定义了一些颜色,如图3-8所示。每种颜色都有一个唯一的索引号。进行颜色设置的时候,指定索引号就可以设置对应的颜色。
图3-8 索引着色的颜色查找表
设置索引着色,使用indexed参数。
>>> c = Color(indexed=32) #索引着色
>>> font = Font(color=c)
OpenPyXL预定义了一些主题颜色,可以调用这些主题颜色进行着色。每个主题颜色也有编号。设置主题颜色,使用theme参数。
>>> c = Color(theme=6, tint=0.5) #主题颜色
>>> font = Font(color=c)
三、样式-设置背景填充
给单元格设置背景填充,可以有渐变色填充和图案填充两种方式,分别使用GradientFill类和PatternFill类进行设置。
渐变色填充
用GradientFill类创建GradientFill对象,利用该对象实现单元格的渐变色填充。创建该对象的构造函数GradientFill格式为:
openpyxl.styles.fills.GradientFill(type='linear', degree=0, left=0, right=0, top=0,
bottom=0, stop=())
有两种渐变填充类型,即线性渐变和路径渐变,type参数的取值分别为'linear'和'path'。
• 线性渐变:颜色从单元格一侧向另一侧渐变,默认时从左至右渐变。设置degree参数,可以改变角度。给stop参数设置一个颜色列表,各颜色的位置从单元格一侧向另一侧等间隔排列。颜色与颜色之间的颜色通过线性插值得到。
• 路径渐变:颜色从单元格四条边向内线性渐变,四个方向填充的宽度分别用left, right, bottom和top参数确定。它们在0到1之间取值,表示宽度或高度的百分比。
下面对单元格B2, E2, 第4行进行线性渐变填充,对G2进行路径渐变填充。
>>> from openpyxl.styles import GradientFill
>>> ws["B2"].fill=GradientFill(type="linear", degree=0, left=0, right=0, top=0, bottom=0, stop=["FF0000","0000FF"])
>>> ws["E2"].fill=GradientFill(type='linear', degree=45, left=0, right=0, top=0, bottom=0, stop=["FF0000","0000FF"])
>>> ws["G2"].fill = GradientFill(type="path", left=0.2, right=0.8, top=0.3, bottom=0.7, stop=["FF0000","0000FF"])
>>> ws.row_dimensions[4].fill=GradientFill(type="linear", degree=0, left=0, right=0, top=0, bottom=0, stop=["FF0000","00FF00"])
>>> wb.save("test.xlsx")
渐变色填充的效果如图3-9所示。
图3-9 渐变色填充
图案填充
用PatternFill类创建PatternFill对象,利用该对象实现单元格的图案填充。创建该对象的PatternFill函数的格式为:
openpyxl.styles.fills.PatternFill(patternType=None, fgColor=<openpyxl.styles.colors.Color object> Parameters: rgb='00000000', indexed=None, auto=None, theme=None, tint=0.0, type='rgb', bgColor=<openpyxl.styles.colors.Color object> Parameters: rgb='00000000', indexed=None, auto=None, theme=None, tint=0.0, type='rgb', fill_type=None, start_color=None, end_color=None)
其中,
• patternType, fill_type – 图案填充类型,其值必须是'darkDown', 'gray0625', 'mediumGray', 'darkHorizontal', 'lightVertical', 'darkGrid', 'lightGray', 'darkTrellis', 'darkVertical', 'lightGrid', 'solid', 'lightDown', 'lightUp', 'darkUp', 'darkGray', 'lightTrellis', 'lightHorizontal', 'gray125'中的一个。
• fgColor, start_color – 前景色,fgColor的值必须为Color对象。
• bgColor, end_color – 背景色,bgColor的值必须为Color对象。
设置fill_type的值为None时,不填充。
>>> from openpyxl.styles import PatternFill
>>> ws["B2"].fill=PatternFill(fill_type=None, start_color="FFFF00", end_color="000000")
设置fill_type的值为solid时,进行单色填充。
>>> ws["C2"].fill = PatternFill(fill_type="solid", start_color="00FF00")
设置fill_type的值为其他值时,进行图案填充。
>>> ws["E2"].fill=PatternFill(fill_type="lightGrid", start_color="FFFF00", end_color="000000")
指定第2列的背景色:
>>> fill = PatternFill(fill_type="lightTrellis", fgColor=Color(rgb="00FF00"), bgColor=Color(rgb="0000FF"))
>>> ws.column_dimensions["B"].fill = fill
指定第4行的背景色:
>>> fill = PatternFill(fill_type="lightGray", fgColor=Color(rgb="FFFF00"), bgColor=Color(rgb="0000FF"))
>>> ws.row_dimensions[4].fill = fill
图案填充的效果如图3-10所示。
图3-10 图案填充
四、设置边框
用Border类创建Border对象,利用该对象实现单元格的边框设置。创建该对象的Border函数的格式为:
openpyxl.styles.borders.Border(left=<openpyxl.styles.borders.Side object> Parameters: style=None, color=None, right=<openpyxl.styles.borders.Side object> Parameters: style=None, color=None, top=<openpyxl.styles.borders.Side object> Parameters: style=None, color=None, bottom=<openpyxl.styles.borders.Side object> Parameters: style=None, color=None, diagonal=<openpyxl.styles.borders.Side object> Parameters: style=None, color=None, diagonal_direction=None, vertical=None, horizontal=None, diagonalUp=False, diagonalDown=False, outline=True, start=None, end=None)
其中,
• left, right, top, bottom, diagonal – 定义左、右、上、下和对角的边框,为Side对象。
• diagonalDown, diagonalUp –布尔型,定义对角线的方向。左上角往右下角画,或左下角往右上角画。
Side对象,顾名思义,表示边线,即线形图形元素。所以它的主要属性有线型和颜色。创建该对象的构造函数Side的语法格式为:
openpyxl.styles.borders.Side(style=None, color=None, border_style=None)
其中,
• style – 边线的风格,值为{'hair', 'dashed', 'mediumDashDot', 'mediumDashDotDot', 'slantDashDot', 'double', 'thick', 'mediumDashed', 'thin', 'medium', 'dashDotDot', 'dashDot', 'dotted'}中的一个。
• color – 颜色。
• border_style – style的别名。
所以,单元格的边框可以看作是多条直线段的组合。
用Border类设置边框,首先要导入Border类和Side类。下面的代码给D4单元格添加了红色边框,其中上下边框为双线,左右边框为单细线。
>>> from openpyxl.styles import Border, Side
>>> ws.cell(row=4, column=4).border = Border(left=Side(border_style='thin', color='FF0000'), right=Side(border_style='thin', color='FF0000'), top=Side(border_style='double', color='FF0000'), bottom=Side(border_style='double', color='FF0000'))
边框设置效果如图3-11所示。
图3-11 设置单元格的边框
五、设置数字
使用numbers类和单元格对象的number_format属性可以设置数字格式。首先导入numbers类:
>>> from openpyxl.styles import numbers
设置数字格式,可以有两种方式,即使用openpyxl内置的格式常数,或直接使用表示数字格式的字符串。
使用openpyxl内置的格式常数
>>> ws["D2"].number_format=numbers.FORMAT_GENERAL
用表示数字格式的字符串
>>> ws["D6"].number_format="yy-mm-dd"
>>> ws["D8"].number_format="d-mmm-yy"
用科学计数法表示数字:
>>> ws["D4"].number_format = '0.00E+00'
在各单元格中输入一些数字或日期,显示效果如图3-12所示。
图3-12 设置数字格式
OpenPyXL中可用的格式常数和字符串如下所示:
• FORMAT_GENERAL="General"
• FORMAT_TEXT="@"
• FORMAT_NUMBER="0"
• FORMAT_NUMBER_00="0.00"
• FORMAT_NUMBER_COMMA_SEPARATED1="#,##0.00"
• FORMAT_NUMBER_COMMA_SEPARATED2="#,##0.00_-"
• FORMAT_PERCENTAGE="0%"
• FORMAT_PERCENTAGE_00="0.00%"
• FORMAT_DATE_YYYYMMDD2="yyyy-mm-dd"
• FORMAT_DATE_YYMMDD="yy-mm-dd"
• FORMAT_DATE_DDMMYY="dd/mm/yy"
• FORMAT_DATE_DMYSLASH="d/m/y"
• FORMAT_DATE_DMYMINUS="d-m-y"
• FORMAT_DATE_DMMINUS="d-m"
• FORMAT_DATE_MYMINUS="m-y"
• FORMAT_DATE_XLSX14="mm-dd-yy"
• FORMAT_DATE_XLSX15="d-mmm-yy"
• FORMAT_DATE_XLSX16="d-mmm"
• FORMAT_DATE_XLSX17="mmm-yy"
• FORMAT_DATE_XLSX22="m/d/yy h:mm"
• FORMAT_DATE_DATETIME="yyyy-mm-dd h:mm:ss"
• FORMAT_DATE_TIME1="h:mm AM/PM"
• FORMAT_DATE_TIME2="h:mm:ss AM/PM"
• FORMAT_DATE_TIME3="h:mm"
• FORMAT_DATE_TIME4="h:mm:ss"
• FORMAT_DATE_TIME5="mm:ss"
• FORMAT_DATE_TIME6="h:mm:ss"
• FORMAT_DATE_TIME7="i:s.S"
• FORMAT_DATE_TIME8="h:mm:ss@"
• FORMAT_DATE_TIMEDELTA="[hh]:mm:ss"
• FORMAT_DATE_YYMMDDSLASH="yy/mm/dd@"
• FORMAT_CURRENCY_USD_SIMPLE='"$"#,##0.00_-"
• FORMAT_CURRENCY_USD="$#,##0_-"
• FORMAT_CURRENCY_EUR_SIMPLE="[$EUR ]#,##0.00_-"
六、设置对齐方式
用Alignment类的构造函数创建Alignment对象,利用该对象设置单元格中数据的对齐方式。创建该对象的Alignment构造函数的格式为:
openpyxl.styles.alignment.Alignment(horizontal=None, vertical=None, textRotation=0, wrapText=None, shrinkToFit=None, indent=0, relativeIndent=0, justifyLastLine=None, readingOrder=0, text_rotation=None, wrap_text=None, shrink_to_fit=None, mergeCell=None)
其中,
• horizontal – 水平对齐,值必须是{‘general’, ‘center’, ‘justify’, ‘distributed’, ‘fill’, ‘right’, ‘centerContinuous’, ‘left’}中的一个。
• vertical – 垂向对齐,值必须是{‘bottom’, ‘distributed’, ‘justify’, ‘center’, ‘top’}中的一个。
• textRotation – 文字旋转角度,以度为单位。值为下面各值中的一个。
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180}
• wrapText – 是否允许换行,布尔型值。
• shrinkToFit – 收缩使单元格装得下。
• indent – 缩格,浮点型。
• relativeIndent – 相对缩格,浮点型。
• justifyLastLine – 调整最后一行,布尔型。
• readingOrder – 阅读顺序,浮点型。
• text_rotation – textRotation的别名。用于属性名称不合法、与Python保留字混淆或使名称更具描述性时使用。
• wrap_text – wrapText的别名。
• shrink_to_fit – shrinkToFit的别名。
• mergeCell – 合并单元格
进行设置之前,首先导入Alignment类:
>>> from openpyxl.styles import Alignment
下面设置3种对齐方式,并应用于单元格C2, C4和C6。
>>> align1=Alignment(horizontal="center", vertical="top")
>>> align2=Alignment(horizontal="right", vertical="bottom", text_rotation=30, wrap_text=True, shrink_to_fit=True, indent=0)
>>> align3=Alignment(horizontal="center", vertical="center", wrap_text=True, indent=3)
>>> #C2单元格采用第1种对齐方式
>>> ws["C2"].alignment=align1
>>> ws["C2"].value="Python123"
>>> #C4单元格采用第2种对齐方式
>>> ws["C4"].alignment=align2
>>> ws["C4"].value="Python123"
>>> #C6单元格采用第3种对齐方式
>>> ws["C6"].alignment=align3
>>> ws["C6"].value="Python123"
>>> wb.save("test.xlsx")
设置对齐方式的效果如图3-13所示。
图3-13 设置对齐方式
七、设置保护
使用Protection类,可以为单元格的内容设置保护。保护方式,一是锁定,二是隐藏,对应于构造函数中的locked和hidden参数。
进行保护设置之前,需要导入Protection类:
>>> from openpyxl.styles import Protection
下面的代码锁定C3单元格。锁定以后,内容不能修改。
>>> ws["C3"].protection = Protection(locked=True, hidden=False)
插入图片
用Image类的构造函数可以创建Image对象,即图片对象。下面从OpenPyXL包中导入Image类,利用它的构造函数和D盘下的pic.jpg图片文件创建Image对象img,使用工作表对象sht的add_image方法将它添加到A1单元格。保存工作簿到指定文件。
>>> from openpyxl.drawing.image import Image
>>> from openpyxl import Workbook
>>> wb=Workbook()
>>> sht=wb.active
>>> img_file=r"D:\pic.jpg"
>>> img=Image(img_file) #利用图片创建Image对象
>>> sht.add_image(img,"A1") #添加Image对象到A1单元格
>>> wb.save(r"D:\image.xlsx")
打开保存的Excel文件后插入图片到A1单元格的效果如图3-14中左图所示。图片的大小没有变化。
图3-14 在工作表中插入图片
使用Image对象的width和height属性可以修改图片对象的宽度和高度。下面关闭Excel窗口,用下面的代码调整单元格的大小和图片大小,将图片添加到单元格H2。保存工作簿文件。
>>> #改变H列的宽度和第2行的高度
>>> sht.column_dimensions["H"].width=18.0
>>> sht.row_dimensions[2].height=48.0
>>> #改变图片的宽度和高度
>>> img2=Image(img_file)
>>> img2.width=46.0
>>> img2.height=46.0
>>> sht.add_image(img2,"H2") #添加图片到H2单元格
>>> wb.save(r"D:\image.xlsx")
打开保存的Excel文件,调整单元格大小和图片的大小后的图片插入效果如图3-14中右侧图片所示。
插入公式
使用OpenPyXL包进行编程时可以在工作表的单元格中插入公式。下面在C1单元格中输入数字10,在C2单元格中输入数字20,在C3单元格中输入字符串"=SUM(C1:C2)",计算C1和C2单元格数字的和,显示在C3单元格中。保存工作簿文件。
>>> from openpyxl import Workbook
>>> wb=Workbook()
>>> sht=wb.active
>>> sht["C1"]=10
>>> sht["C2"]=20
>>> sht["C3"]="=SUM(C1:C2)" #插入公式,求和
>>> wb.save(r"D:\test.xlsx")
打开保存的Excel文件,显示效果如图3-15所示。C3单元格中显示C1单元格和C2单元格中数字的和30。
图3-15 在工作表中插入公式