OpenXML - создайте и откройте файл Excel, не сохраняя его - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть код, который создает новый файл Excel из Datatable, используя OpenXML.Когда я закончу с созданием этого файла, я хочу открыть его для пользователя, но не сохраняя его.В основном, что делает Excel в этом случае, так это то, что он открывает файл Excel как «Workbook1», а затем, если вы хотите сохранить его вручную.У меня есть это требование, потому что пользователи хотят проверить соответствие данных перед сохранением файла на диск.

Это можно сделать в Interop by Visibility (у меня уже есть это решение, но проблема в том, что Interop очень медленно работает на огромныхданные, поэтому пользователи не удовлетворены этим), но я не могу найти способ сделать то же самое в OpenXML.Если у кого-то есть предложения, пожалуйста, дайте мне знать.Вот мой код для создания файла Excel:

  public void Export_To_Excel_stream(MemoryStream ms, DataTable dt)
        {
            using (SpreadsheetDocument dokument = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook))
            {
                WorkbookPart workbookPart = dokument.AddWorkbookPart();
                workbookPart.Workbook = new Workbook();

                WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
                var sheetData = new SheetData();
                worksheetPart.Worksheet = new Worksheet(sheetData);

                Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());
                Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = dt.TableName };
                sheets.Append(sheet);

                //header row
                Row header = new Row();
                List<String> Cols = new List<string>();
                foreach (DataColumn col in dt.Columns)
                {
                    Cols.Add(col.ColumnName);

                    Cell cell = new Cell
                    {
                        DataType = CellValues.String,
                        CellValue = new CellValue(col.ColumnName)
                    };
                    header.AppendChild(cell);
                }
                sheetData.AppendChild(header);


                foreach (DataRow row in dt.Rows)
                {
                    Row new_row = new Row();
                    foreach (String col in Cols)
                    {
                        Cell cell = new Cell
                        {
                            DataType = CellValues.String,
                            CellValue = new CellValue(row[col].ToString())
                        };
                        new_row.AppendChild(cell);
                    }
                    sheetData.AppendChild(new_row);
                }
                workbookPart.Workbook.Save();

            }

1 Ответ

0 голосов
/ 15 апреля 2019

Лучшее, что я понял, - это открыть файл Excel как процесс, а затем удалить его, когда процесс завершится. Тем не менее, мой код для OpenXML - это .dll, поэтому, когда я закрываю приложение с уже открытым файлом Excel, оно больше не удаляется автоматически:

public string file_path;

public void Export_To_Excel_stream(MemoryStream ms, DataTable dt)
{
    //...at the end, whe OPENXML file is created..        
    var open_Excel = Process.Start(file_path);
    open_Excel.EnableRaisingEvents = true;
    open_Excel.Exited += new EventHandler(open_excel_Exited);
 }

public void open_excel_Exited(object sender, EventArgs e)
{
     File.Delete(file_path);
}

Я был бы более чем счастлив, если у кого-нибудь есть лучшее решение:)

...