1

我必须从我页面的表格中显示的数据创建一个 .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();
            }

在这里我想打开它。

4

1 回答 1

0

I had the same 'requirement' to be able to export to xls, and instead I gave the client an export to csv, which will open in excel if you are on a machine with excel installed but is also available to other systems. I achieved it like this.

Create an extension method that supports .AsCsv, which was taken largely from Mike Hadlow's implementation

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());
    }

}

Then you would need set your controller method to return a FileContentResult and have some logic like this within the controller method:

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);
于 2012-08-09T10:20:43.593 回答