在上一篇文章中,讲解了如何在Excel中使用putexcel命令写出简单的表达式并且实现文本和单元格的布局。今天,我们讲解一下如何写出更复杂的表达式,比如宏,图表和矩阵。甚至是如何在Excel中通过编写公式来创建计算单元。在Excel中,这些是我们实现报表自动生成的重要步骤。
在开始讲解案例前,我先创建一个putexcel2.xlsx的单独文件,并把每个案例写到单独的工作表中。putexcel set命令如下:
我可以为每个案例创建一个独立的Excel文件,但是我更喜欢一个文件中包含多个工作表。当你创建大型报表的时候我想你也会喜欢使用这种方法。
输入webuse nhanes2可以下载案例中所需的数据集。我将使用数据集的子集并且重新标记一些变量,所以不必介意你的数字是否与我的完全一致。
案例1将返回结果写入Excel
STATA的很多命令可以返回标量,宏和矩阵。我们可以使用putexcel命令将这些写到一个Excel表中。比如,我可能想把年龄的平均值写到Excel里,那么我可以在summarize age之后输入return list来查看返回结果列表。这时平均值被保存在标量r(mean)中。
设置putexcel2.xlxs中“example 1”工作表的目标文件,然后可以在单元格A1中写入表达式"Mean Age = ",在单元格B1中写入表达式`r(mean) '。注意r(mean)要用单引号括起来。这是告诉STATA我想把r(mean)值写在单元格B2中。
打开生成的Excel文件,发现平均值已经成功的写到了单元格B2中。
案例2:用Excel格式格式化数字
可以使用Excel格式中的nformat()选项来指定一个数字的显示格式。比如,可以使用nformat(“#.###”)这个选项使平均值显示到小数点后三位。
可以在[P]putexcel advanced选项部分查看到Excel格式选项的完整描述。
案例3:用STATA设计数字格式
STATA包含许多快捷格式代码可与nformat()一起使用。比如,可以使用number_d2选项使平均值显示到小数点后两位。
可以在附录[P]putexcel中查看完整的数字格式代码表。
案例4:用string()功能格式化数字
我也可以让平均值和标准偏差输出在一个单元格内。这个功能可以通过2个步骤实现。首先,将r(mean)和r(sd)分别保存在本地宏meanage和sdage中。string()功能允许我指定到小数点后一位。第二步,创建一个名为meansd的本地宏,将meanage和sdage合并成一个表达式。注意使用putexcel B1 = “`meansd'”命令时必须使用双引号,因为meansd是一个字符串。
案例5:在Excel文档中添加图表
我可能希望我的Excel文件中包含一个年龄的柱形图。首先,创建一个柱形图并且使用graph export命令将图表保存成 .png格式文件。
然后,使用picture(age.png)表达式将图表放到表格中。
案例6:为Excel编写矩阵
一些STATA命令可以返回矩阵。比如,我可以使用tabstat计算变量列表的描述性统计。Save选项会告诉tabstat将结果保存为矩阵。
当输入teturn list命令时,会看到tabstat返回矩阵r(StatTotal)。
我更愿意创建一个Excel表,看起来像是从summarize输出的行的变量和列的统计。所以我创建了一个名为results的矩阵,等同于对r(StatTotal)进行置换。
然后使用matrix(results)表达式在Excel中写入矩阵results。我使用matrix(r(StatTotal)’)表达式,而不是去创建一个新的矩阵,在写入Excel之前我想向你们展示转置矩阵。矩阵的左上角将放在Excel表格的A1单元格中。names选项告诉putexcel运用矩阵写入Excel行和列的名称。nformat(number_d2)选项告诉putexcel展示矩阵到小数点后两位。
下一步,我想排版一下Excel表格,使它看起来更像一个结果表,而不是一个矩阵。不在单元格中写入任何内容就可以更改单元格的格式,甚至可以使用语法ul:br对单元格的范围进行设置,ul在单元格的左上角,br在单元格的右下角。
单元格B2:B6中每个变量的样本大小不需要显示到小数点后两位,所以我用nformat(number)选项使单元格B2:B6不显示小数点后两位。Overwritefmt选项告诉putexcel覆盖现有的单元格格式。
然后,设置A1:A6单元格。right选项可以使单元格的内容右对齐,border(right)选项可以为单元格的右侧添加边框。
可以用类似的方法设置A1:F1单元格。hcenter选项可以使标签水平居中对齐,border(bottom)选项可以在单元格A1:F1下方增加边框。
最后,对B2:F6单元格的数字显示字体加粗,使表格看起来像summarize输出的结果。
排版后的Excel表格看起来是这样:
案例7:将回归系数写到Excel中
大多数Stata回归命令在r(table)的矩阵中返回系数表。比如,可以使用regress拟合以下线性回归模型。
并且输入matlist r(table)来查看系数矩阵。
r(table)包含df,crit和eform行,这些在回归输出时是不显示的。我想在Excel表中复制系数表,那么我要将r(table)保存到results矩阵中,提取results的前6行,然后对results进行置换。
现在,可以将results写入Excel文件中了。
对字体和单元格格式的一些调整使矩阵看起来更像一个系数表。
案例8:在Excel中写入交叉表
通过使用矩阵我们同样也可以将结果从tabulate写入Excel中。 matcell()选项保存矩阵tabulate中的单元格数量。比如,我可以在cellcounts矩阵下面保存tabulate命令结果。
通过以下步骤可以用sex的值标签来重新命名cellcounts的行名称。首先,sex保存为一个数值变量,因此可以使用decode来创建一个名为sex_s字符串变量。如果sex作为字符串变量保存的话那么我们可以省略掉这一步。第二步,使用levelsof保存sex_s的层级到本地宏sexlabels中。然后,使用matrix rownames标记cellcounts行,并把标签保存到sexlabels。
同样的步骤,使用race值标签来重新命名cellcounts列。
就像上面2个例子一样可以把cellcounts写到Excel里。
这种方法是可行的,但是Excel表中没有行和列的合计数量。添加这个的方法就是使用formula()表达式把表中需要计算的单元格放进去。比如,putexcel下面第一行的单元格E2中放入Excel函数SUM(B2:D2)。这个就可以计算表中第一行的表格总数。下面的putexcel命令把公式放入表中计算出行和列的总量。
可以通过添加标签和边框直观的区分单元格中行和列的总数。同样也可以通过加粗字体来突出数字。
Excel表格类似于tabulate输出的表格。
使用返回标量,宏,和矩阵,并用putexcel命令在Excel表格中重新创建的Stata输出是很容易。案例1-7中很好的概括了任意变量,但是在案例8中我硬编码了变量sex和race行和列的总数。