Member 11683251 Ответов: 2

C#, выполняемый через оболочку из VBA, не создает файл


Предыстория: я получил огромную стену sql-кода из программы, которую я хочу использовать для сброса данных в excel. Выполнение этого кода из VBA приводит к большому количеству ошибок, и кусок кода слишком велик и запутан, чтобы пройти через него.

Запуск запроса на C# работает нормально, поэтому я написал программу, которая захватывает данные и сбрасывает их в файл, который я называю excelDump. csv

Для удобства использования, чтобы избежать необходимости запускать эту программу отдельно, я вызываю программу через макрос vba. Как только программа выполнена, я хватаю (в vba) данные в dumb и заполняю свой лист excel.

Вызывается программа c#, консоль показывает все, что я хочу, она закрывается с правильным кодом выхода, и я подтверждаю этот код в VBA, прежде чем пытаться открыть дамп.

Вот код, который я запускаю в C#

public void DumpToExcel()
       {
           using (System.IO.StreamWriter fs = new System.IO.StreamWriter("excelDump.csv"))
           {
               // Loop through the fields and add headers
               for (int i = 0; i < myReader.FieldCount; i++)
               {
                   string name = myReader.GetName(i);
                   if (name.Contains(","))
                       name = "\"" + name + "\"";

                   fs.Write(name + ",");
               }
               fs.WriteLine();

               // Loop through the rows and output the data
               while (myReader.Read())
               {
                   for (int i = 0; i < myReader.FieldCount; i++)
                   {
                       string value = myReader[i].ToString();
                       if (value.Contains(","))
                           value = "\"" + value + "\"";

                       fs.Write(value + ",");
                   }
                   fs.WriteLine();
               }

               fs.Close();
           }
       }


Что я уже пробовал:

Сначала я подумал, что проблема в том, что программа не может перезаписать файл, поэтому я попытался удалить его, но не смог. Программа отлично работает, когда я запускаю ее из visual studio или выпускаю сборку из exe. Но вызов его из оболочки не создает новый файл. Использовать файл.удалить можно удалить старый просто отлично.

Я подумал, что, может быть, программа c# быстро завершает работу до того, как файлы будут созданы, но я ждал, прежде чем импортировать данные, и все равно ничего.

Bernhard Hiller

Что такое "myReader"? Пытается ли он прочитать файл Excel, содержащий макрос?

Member 11683251

OdbcDataReader myReader;

Он запускает SQL-запрос. Эти программы захватывают данные из sql и дампов в excel. Другой excel импортирует эти данные в себя. Я вызываю эту программу из программы импорта excel через оболочку.

Bernhard Hiller

Что происходит, когда вы заменяете "excelDump. csv" на полный путь (например, "c:\\temp\\excelDump.csv")? Возможно, возникла проблема с "текущим рабочим каталогом".

Member 11683251

Это, кажется, работает, файлы были созданы, и в них есть правильные данные.
Большое спасибо! Опубликуйте это как ответ, и я приму его. :)

2 Ответов

Рейтинг:
8

Bernhard Hiller

Рабочий каталог для выполнения макроса может отличаться от папки файла. С полным путем, как "c:\\temp\\excelDump.csv"- вы находитесь на более безопасной стороне.


Рейтинг:
1

#realJSOP

Вам также необходимо инкапсулировать поле с двойными кавычками, если само поле содержит одну или несколько двойных кавычек.