After several experiments, I found a solution that works for me.
There are many ADOs that handle certain functions. I used outreg2 for regressions and tabout for summary statistics.
For simpler commands, it's easy to write your own programs to automatically save the results in plain text in a standard format. Here are a few of them that I wrote ... note that both of these results are displayed (for saving to a log file) and exported to text files. If you just want to save the text, you can get rid of the di and qui commands sum , tab , etc.:
cap program drop sumout program define sumout di "" di "" di "Summary of `1'" di "" sum `1', d qui matrix X = (r(mean), r(sd), r(p50), r(min), r(max)) qui matrix colnames X = mean sd median min max qui mat2txt, matrix(X) saving("`2'") replace end cap program drop tab2_chi_out program define tab2_chi_out di "" di "" di "Tabulation of `1' and `2'" di "" tab `1' `2', chi2 qui matrix X = (r(p), r(chi2)) qui matrix colnames X = chi2p chi2 qui mat2txt, matrix(X) saving("`3'") replace end cap program drop oneway_out program define oneway_out di "" di "" di "Oneway anova with dv = `1' and iv = `2'" di "" oneway `1' `2' qui matrix X = (r(F), r(df_r), r(df_m), Ftail(r(df_m), r(df_r), r(F))) qui matrix colnames X = anova_between_groups_F within_groups_df between_groups_df P qui mat2txt, matrix(X) saving("`3'") replace end cap program drop anova_out program define anova_out di "" di "" di "Anova command: anova `1'" di "" anova `1' qui matrix X = (e(F), e(df_r), e(df_m), Ftail(e(df_m), e(df_r), e(F)), e(r2_a)) qui matrix colnames X = anova_between_groups_F within_groups_df between_groups_df P RsquaredAdj qui mat2txt, matrix(X) saving("`2'") replace end
The question is how to get the output in Excel and format it. I found that the best way to import text output files from Stata to Excel is to combine them into one large text file and then import this single file using the Import Text File... function in Excel.
I merge the files by putting this Ruby code in the output folder and then running int from my Do file using qui shell cd path/to/output/folder/ && ruby table.rb :
output = "" Dir.new(".").entries.each do |file| next if file =~/\A\./ || file == "table.rb" || file == "out.txt" if file =~ /.*xml/ system "rm #{file}" next end contents = File.open(file, "rb").read output << "\n\n#{file}\n\n" << contents end File.open("out.txt", 'w') {|f| f.write(output)}
As soon as I import out.txt into my worksheet in Excel, I use a bunch of Excel built-in functions to collect the data into beautiful beautiful tables.
I use a combination of vlookup , offset , match , iferror and hidden columns with cell numbers and file names for this. The source .txt file is included in out.txt just above the contents of this file, which allows you to view the contents of the file using these functions, and then reference specific cells using vlookup and offset .
This Excel business is actually the hardest part of this system, and there really is no good way to explain it without showing you the file, although I hope you can get enough ideas to figure it out for yourself. If not, feel free to contact me through http://maxmasnick.com and I can get more information.