ASP.NET MVC打开.xls文件

时间:2012-08-09 09:02:18

标签: asp.net-mvc

我必须从页面中的表格中显示的数据创建.xls文件。当用户单击“导出”按钮时会发生这种情况。我有以下代码,它创建好了。现在,我想在同一个单击中打开此文件。我应该如何打开它供用户查看?

 string filePath = "C:/Upload/Stats_" + viewModel.SelectedTest.ToString() + ".xls";
            //write the header
            using (var pw = new StreamWriter(filePath, true))
            {
                pw.WriteLine(String.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\t{9}", "Month", "Total Users", "K",
                                           "T", "G", "Detail", "GS",
                                           "BI", "GHF","A"));

                //write to the file

                for (int i = 0; i < 12; i++)
                {
                    pw.WriteLine(
                        String.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\t{9}", viewModel.Months[i],
                                      viewModel.M[i], viewModel.MKau[i],
                                      viewModel.MTech[i], viewModel.MGew[i],
                                      viewModel.MDet[i], viewModel.MGes[i],
                        viewModel.MBea[i], viewModel.MGesHf[i],viewModel.MAug[i]));
                    pw.Flush();
                }

                pw.Close();
            }

我想打开它。

1 个答案:

答案 0 :(得分:0)

我有相同的'要求'能够导出到xls,而是我给客户端导出到csv,如果你在安装了excel但也可用于其他系统的机器上,它将在excel中打开。我是这样实现的。

创建一个支持.AsCsv的扩展方法,该方法主要来自Mike Hadlow's实现

public static class EnumerableExtensions
{
    public static string AsCsv<T>(this IEnumerable<T> items) where T : class
    {
        var csvBuilder = new StringBuilder();
        var properties = typeof(T).GetProperties();
        foreach (T item in items)
        {
            string line = string.Join(",", properties.Select(p => p.GetValue(item, null).ToCsvValue()).ToArray());
            csvBuilder.AppendLine(line);
        }

        return csvBuilder.ToString();
    }

    private static string ToCsvValue<T>(this T item)
    {
        if (item is string)
        {
            return string.Format("\"{0}\"", item.ToString().Replace("\"", "\\\""));
        }

        double dummy;
        if (double.TryParse(item.ToString(), out dummy))
        {
            return string.Format("{0}", item.ToString());
        }

        return string.Format("\"{0}\"", item.ToString());
    }

}

然后你需要设置你的控制器方法来返回一个FileContentResult并在控制器方法中有这样的逻辑:

var outputModel = viewModel.ToList().Select(model => new
{
                Months = model.Months
                M = model.M[i],
                MKau= model.MKau,
                MTech = model.MTech,
                MGew = model.MGew,
                MDet = model.MDet,
                MGes = model.MGes,
                MBea= model.MBea,
                MGesHf= model.MGesHf
});

string csv = "\"Month\",\"Total Users\",\"K\",\"T\",\"G\",\"Detail\",\"GS\",\"BI\",\"GHF\",\"A\"" 
                        + System.Environment.NewLine
                        + outputModel.AsCsv();
string fileName = "Stats_" + viewModel.SelectedTest.ToString() + ".csv"

return this.File(new System.Text.UTF8Encoding().GetBytes(csv), "text/csv", fileName);
相关问题