C#如何使用嵌入式资源中的Excel文件

4
我正在为我女友编写一个成绩评分程序,但在尝试将数据输出到一个嵌入到程序中的Excel文件时被卡住了。目前它可以把数据写入一个空白的Excel文件,但我想使用一个预制的Excel文件,只需将数据导出到相应的单元格即可。我无法弄清楚如何告诉程序使用资源文件夹中的xls文件,而不是创建一个空白的Excel文件。以下是目前用于保存的代码。我正在使用C#2008 Express版。
谢谢
我的资源引用是:Properties.Resources.gradesheet
Excel.Application xlApp;
        Excel.Workbook xlWorkBook;            
        Excel.Worksheet xlWorkSheet;

        object misValue = System.Reflection.Missing.Value;


        xlApp = new Excel.ApplicationClass();
        xlWorkBook = xlApp.Workbooks.Add(misValue);

        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
        //add data to excel
        xlWorkSheet.Cells[1, 1] = firstName;
        xlWorkSheet.Cells[2, 1] = lastName;




        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);
5个回答

5

这应该会对你有所帮助。(在.NET 4.5中测试过)。

public void openExcelTemplateFromResources ()
{
    string tempPath = System.IO.Path.GetTempFileName(); 

    System.IO.File.WriteAllBytes(tempPath, Properties.Resources.excelResource);

    Excel.Application excelApplication = new Excel.Application();
    Excel._Workbook excelWorkbook;
    excelWorkbook = excelApplication.Workbooks.Open(tempPath)

    excelApplication.Visible = true; // at this point its up to the user to save the file
}

2
您需要从资源中获取Excel文件并保存到文件中。然后您可以在工作簿上执行打开操作:
xlApp.Workbooks.Open(fileName);

谢谢回复,所以没有办法直接告诉C#使用我的资源中的Excel文件作为模板而不必先保存文件吗? - Boundinashes6
1
不,Excel是基于文件工作的,所以它需要一个基本文件作为起点。你唯一的其他选择就是使用Excel自动化程序来编程创建文件中的所有内容。虽然不难,但更容易的方法可能是将文件保存到临时位置并从那里进行操作。 - John Koerner

1

正如John Koerner所说,Excel是基于文件的,因此您需要先将Excel文件保存到文件中。

但是,如果您可以使用.XLSX而不是.XLS,那么使用EPPlus创建Excel文件比使用Interop更好。它更容易,并且没有Interop存在的所有问题。

根据this link,根据您想要对Excel文件执行的操作以及您将如何使用它,情况略有不同。您可以:

  • 将流直接传递给支持流作为参数的对象。例如,Excel Package Plus 可以直接从任何流中读取 Excel 文件,并将对象加载到内存中。然后,您可以操作该对象并调用 Save 方法将其写入文件,传递一个 filestreamfilename
  • 通过创建具有正确目标文件名的可写 Filestream 对象(使用 File.OpenWrite)并调用 yourManifestResourceStream.CopyTo(yourFileStream) 将流保存到(临时)文件中。然后,您可以将 filename 传递给另一个进程(如 Excel),并从文件系统中打开它。

0

您可以创建Excel模板文件(.xlt),然后基于该模板打开新的.xls文件。祝好,AB


0

首先,您应该使用此函数获取资源文件的流:

 public static Stream GetResourceFileStream(string fileName)
            {
                Assembly currentAssembly = Assembly.GetExecutingAssembly();
                // Get all embedded resources
                string[] arrResources = currentAssembly.GetManifestResourceNames();

                foreach (string resourceName in arrResources)
                {
                    if (resourceName.Contains(fileName))
                    {
                        return currentAssembly.GetManifestResourceStream(resourceName);
                    }
                }

                return null;
            }

然后你可以使用流进行操作,或者将流保存到文件中:如何将流保存到文件中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接