Форум программистов, компьютерный форум, киберфорум
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 121
.NET 4.x

Проблемы с выгрузкой экселевского файла

20.10.2023, 15:02. Показов 1893. Ответов 20

Студворк — интернет-сервис помощи студентам
Доброго времени,

такая проблема, формирую эксель, возникает ошибка, что формат или расширение недопустимы,
иногда предлагает исправить - и файл нормальный.

делаю так -формирую эксель:
XLWorkbook wb

потом его кидаю в поток:
C#
1
2
 MemoryStream memoryStream = new MemoryStream();
 wb.SaveAs(memoryStream);
и пытаюсь выгрузить:
C#
1
2
3
4
5
Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("content-disposition", "attachment;    filename=111.xlsx");
memoryStream.WriteTo(Response.OutputStream);
 Response.Flush();
это я привел пример, который у меня заработал,
попробовал несколько раз - все нормально,
но потом закрыл проект - открыл через какое-то время - и снова те же ошибки про формат...

если wb и поток кинуть в файл:
C#
1
2
wb.SaveAs(@"c:\\1\ddd.xlsx");
System.IO.File.WriteAllBytes(@"C:\\1\\filename.xlsx", memoryStream.ToArray());
то файлы открываются нормально ,хотя если их сравнить - то они отличаются.

а файл 111.xlsx получается вообще другой...



подскажите , в чем проблема? Что я не так делаю?

Добавлено через 4 часа 46 минут
нашел почему перестало работать, ранее я сначала сохранял файлы на диск ,а потом передавал на нмх ссылку,

когда я тестировал ,я для контроля записывал из XLWorkbook файл на диск,
потом конечно убрал... и вот из-за этого и начинаются проблемы, если
перед выгрузкой файла из потока XLWorkbook кидаю на диск ,- то все работавет,
как только не сохраняю на диске - сразу - ошибки...

с этой процедурой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
protected void Respon_file(string name_f, XLWorkbook wb)
    {
 
MemoryStream memoryStream = new MemoryStream();
        wb.SaveAs(memoryStream);
memoryStream.Position = 0;
 
Response.Clear();
        Response.ContentType = "application/vnd.ms-excel";
        Response.AddHeader("content-disposition", "attachment;    filename="+name_f);
        Response.BinaryWrite(memoryStream.ToArray());
    Response.End();
}
так не работает
C#
1
2
3
4
 //workbook.SaveAs(@"c:\\1\\qqq.xlsx");
 
 
            Respon_file(Path.GetFileName(xsltPath), workbook);
а так работает
C#
1
2
3
4
 workbook.SaveAs(@"c:\\1\\qqq.xlsx");
 
 
            Respon_file(Path.GetFileName(xsltPath), workbook);

не понимаю... Вы можете что подсказать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.10.2023, 15:02
Ответы с готовыми решениями:

Проблемы с выгрузкой файлов
Здравствуйте при выгрузке файлов, при совпадении имен как я понимаю почему то одному файлу присвается имя что в роде ATTH89S2. Выгружаю...

Проблемы с выгрузкой на github
Всем доброго времени суток! Помогите, пожалуйста, новичку начать работать на гитхабе. Это требование вуза выкладывать туда свою работу. Я...

Проигрывание музального файла, находящегося внутри экселевского файла
Я видел тему "Как воспроизвести .mp3 файл на Visual Basic 6.0? - Visual Basic" и нашел там два замечательных способа вызова музыкального...

20
Нарушитель
170 / 286 / 26
Регистрация: 11.08.2022
Сообщений: 3,648
22.10.2023, 23:26
А если попробовать добавить
C#
1
Responce.Expires = 0
?
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 121
23.10.2023, 09:16  [ТС]
C#
1
Response.Expires = 0;
не помогло...
0
Нарушитель
170 / 286 / 26
Регистрация: 11.08.2022
Сообщений: 3,648
23.10.2023, 09:19
Цитата Сообщение от Леонид_М Посмотреть сообщение
когда я тестировал ,я для контроля записывал из XLWorkbook файл на диск,
потом конечно убрал... и вот из-за этого и начинаются проблемы, если
перед выгрузкой файла из потока XLWorkbook кидаю на диск ,- то все работавет,
как только не сохраняю на диске - сразу - ошибки...
Возможно ещё, система держит его в кеше потока в памяти,
а сохранение на диск закрывает файл и поток.
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 121
23.10.2023, 13:22  [ТС]
не совсем понял - что именно закрывает?

объект XLWorkbook я сначала кидаю в файл, после этого
XLWorkbook кидаю в поток...

что меняется в XLWorkbook, когда я его сохраняю в файле?
0
Нарушитель
170 / 286 / 26
Регистрация: 11.08.2022
Сообщений: 3,648
23.10.2023, 19:20
Цитата Сообщение от Леонид_М Посмотреть сообщение
что меняется в XLWorkbook, когда я его сохраняю в файле?
вы закрываете файл на запись?
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 121
24.10.2023, 10:24  [ТС]
нет, по хорошему - мне вообще не нужно workbook кидать в файл, только в поток...
если нужно закрывать на запись - как это? подскажите.
0
Нарушитель
170 / 286 / 26
Регистрация: 11.08.2022
Сообщений: 3,648
24.10.2023, 14:33
Цитата Сообщение от Леонид_М Посмотреть сообщение
нет, по хорошему - мне вообще не нужно workbook кидать в файл, только в поток...
если нужно закрывать на запись - как это? подскажите.
Во время записи файла на диск блокируется его название, чтобы нельзя было загрузить два файла с одинаковым названием.
Открыть файл можно на чтение и на запись. Но когда все операции с ним закончены, обязательно закрыть.
Подозреваю, что то же и с потоками. Поток надо каким-то образом финализировать, чтобы он сбросил все буферы в файловую память.
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 121
24.10.2023, 15:38  [ТС]
Я посмотрел - нет в методах потока такого...

я еще попробовал сделать выгрузку workbook в 2 разных потока подряд,
так вот получается, что данные в потоках даже длину разную имеют...
возможно сам XLWorkbook глючит...

если только попробовать как-то по другому, но как?
0
Нарушитель
170 / 286 / 26
Регистрация: 11.08.2022
Сообщений: 3,648
24.10.2023, 17:08
Выводить в поток.
Но поток перенаправить в файл.

Добавлено через 52 минуты
Читайте здесь
Использование Visual C# для чтения и записи в текстовый файл

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
String line;
try
{
    //Pass the file path and file name to the StreamReader constructor
    StreamReader sr = new StreamReader("C:\\Sample.txt");
    //Read the first line of text
    line = sr.ReadLine();
    //Continue to read until you reach end of file
    while (line != null)
    {
        //write the line to console window
        Console.WriteLine(line);
        //Read the next line
        line = sr.ReadLine();
    }
    //close the file
    sr.Close();
    Console.ReadLine();
}
catch(Exception e)
{
    Console.WriteLine("Exception: " + e.Message);
}
finally
{
    Console.WriteLine("Executing finally block.");
}
FileStream. Чтение и запись файла

C#
1
2
3
4
5
6
7
8
9
10
11
12
FileStream? fstream = null;
try
{
    fstream = new FileStream("note3.dat", FileMode.OpenOrCreate);
    // операции с fstream
}
catch(Exception ex)
{  }
finally
{
    fstream?.Close();
}
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 121
24.10.2023, 18:08  [ТС]
я как раз и хотел уйти от сохранения файла, чтобы сразу из потока отправлять файл пользователю.
0
Нарушитель
170 / 286 / 26
Регистрация: 11.08.2022
Сообщений: 3,648
24.10.2023, 18:50
Цитата Сообщение от Леонид_М Посмотреть сообщение
чтобы сразу из потока отправлять файл пользователю.
А он отправится, если он не закрыт?
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 121
25.10.2023, 10:14  [ТС]
отправляется, как я подозреваю, проблема все же в XLWorkbook,
т.к. если я перед передачей файла в поток сохраняю его на диске из XLWorkbook - то
проходит, а если не сохраняю ,то из потока уже файл с ошибкой выходит.
0
Нарушитель
170 / 286 / 26
Регистрация: 11.08.2022
Сообщений: 3,648
25.10.2023, 13:56
Цитата Сообщение от Леонид_М Посмотреть сообщение
если я перед передачей файла в поток сохраняю его на диске из XLWorkbook - то
проходит,
в момент сохранения файл закрывается.
а если просто писать в поток, то вы никогда не узнаете, что файл закончился.
будете ждать его конца в бесконечность.
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 121
25.10.2023, 16:41  [ТС]
и как же его закрыть? Я ничего нужного по этому поводу не нашел,
ток вот это:
Really a different question, but do something like this before xlWorkBook.Close : Application.DisplayAlerts = False xlWorkBook.SaveAs (etc.) Application.DisplayAlerts = True

но Application там нет... а xlWorkBook.SaveAs - мне не нужно.

я пробовал делать диспозе после передачи в поток -но это не помогло.
0
Нарушитель
170 / 286 / 26
Регистрация: 11.08.2022
Сообщений: 3,648
25.10.2023, 16:55
Цитата Сообщение от Леонид_М Посмотреть сообщение
и как же его закрыть?
вы закрыли файл, сохранив его.

Цитата Сообщение от Леонид_М Посмотреть сообщение
я пробовал делать диспозе после передачи в поток -но это не помогло.
диспозе просто всё удаляет, но не закрывает файл.
0
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 121
25.10.2023, 18:06  [ТС]
но мне ненужно его сохранять - тогда теряется весь смысл - отправлять файл без сохранения на диск сразу пользователю.
0
Нарушитель
170 / 286 / 26
Регистрация: 11.08.2022
Сообщений: 3,648
26.10.2023, 01:04
Цитата Сообщение от Леонид_М Посмотреть сообщение
но мне ненужно его сохранять - тогда теряется весь смысл - отправлять файл без сохранения на диск сразу пользователю.
пользователю вы не можете отправить незакрытый файл или поток - тогда у него нет конца.
но как закрыть файл в памяти, не сохраняя на диск?
попробуйте MemoryMappedFile

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
 
class Program
{
    static void Main(string[] args)
    {
        long offset = 0x10000000; // 256 megabytes
        long length = 0x20000000; // 512 megabytes
 
        // Create the memory-mapped file.
        using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\ExtremelyLargeImage.data", FileMode.Open,"ImgA"))
        {
            // Create a random access view, from the 256th megabyte (the offset)
            // to the 768th megabyte (the offset plus length).
            using (var accessor = mmf.CreateViewAccessor(offset, length))
            {
                int colorSize = Marshal.SizeOf(typeof(MyColor));
                MyColor color;
 
                // Make changes to the view.
                for (long i = 0; i < length; i += colorSize)
                {
                    accessor.Read(i, out color);
                    color.Brighten(10);
                    accessor.Write(i, ref color);
                }
            }
        }
    }
}
 
public struct MyColor
{
    public short Red;
    public short Green;
    public short Blue;
    public short Alpha;
 
    // Make the view brighter.
    public void Brighten(short value)
    {
        Red = (short)Math.Min(short.MaxValue, (int)Red + value);
        Green = (short)Math.Min(short.MaxValue, (int)Green + value);
        Blue = (short)Math.Min(short.MaxValue, (int)Blue + value);
        Alpha = (short)Math.Min(short.MaxValue, (int)Alpha + value);
    }
}
1
2 / 1 / 1
Регистрация: 11.06.2022
Сообщений: 121
26.10.2023, 16:24  [ТС]
спасибо, попробую,

но через контроллеры работает это:
C#
1
2
3
4
5
            return File(
                content,
                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                "Report.xlsx"
                );
тут не нужно сохранять файл на диск... но это Core, а у меня просто asp net.

вот пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public FileResult SaveEndOfBase()
        {
            var workbook = new XLWorkbook();
            var worksheet = workbook.Worksheets.Add("Лист1");
 
            //создадим заголовки у столбцов
            worksheet.Cell("A" + 1).Value = "Имя";
            worksheet.Cell("B" + 1).Value = "Фамиля";
            worksheet.Cell("C" + 1).Value = "Возраст";
 
            // 
 
            worksheet.Cell("A" + 2).Value = "Иван";
            worksheet.Cell("B" + 2).Value = "Иванов";
            worksheet.Cell("C" + 2).Value = 18;
            //пример изменения стиля ячейки
            worksheet.Cell("B" + 2).Style.Fill.BackgroundColor = XLColor.Red;
 
            // пример создания сетки в диапазоне
            var rngTable = worksheet.Range("A1:G" + 10);
            rngTable.Style.Border.RightBorder = XLBorderStyleValues.Thin;
            rngTable.Style.Border.BottomBorder = XLBorderStyleValues.Thin;
 
            worksheet.Columns().AdjustToContents(); //ширина столбца по содержимому
 
            // [B]вернем пользователю файл без сохранения его на сервере  ----!!!!!!!!!!!!!!!!!!!!![/B]
            using (MemoryStream stream = new MemoryStream())
            {
                workbook.SaveAs(stream);
                return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Base.xlsx");
            }
        }
0
Нарушитель
170 / 286 / 26
Регистрация: 11.08.2022
Сообщений: 3,648
26.10.2023, 18:23
Цитата Сообщение от Леонид_М Посмотреть сообщение
тут не нужно сохранять файл на диск...
а вы же всё равно задаёте название файла.
возможно, он сохраняется в фоне в рабочем каталоге.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.10.2023, 18:23
Помогаю со студенческими работами здесь

Проблемы с выгрузкой информации в Excel
Есть вьюха первое поле - номер во вьюхе остальные поля с данными текстовыми и одно поле многострочное. Выгружаю все это щастье в...

Проблемы, связанные с ContentManager и загрузкой/выгрузкой контента
Краткая сводка: 1) Рабочий пример загрузки текстуры 2) RootDirectory нельзя изменить после присвоения. Однако это не мешает...

Сохранение открытого экселевского файла
Как сохранить открытый экселевский файл с текущей датой в имени файла.Сохранение осуществить в ту же папку, где и был открыт экселевский...

Как данные из экселевского файла перенести в матрицу?
Есть код как вытащить данные из экселевского файла. А как их занести потом в матрицу? (нужно потом посчитать среднее арифметическое каждого...

нужно чтобы данные из экселевского файла водились в программу
Привет!!! кто нибудь сможет помочь?? нужно чтобы данные из экселевского файла водились в программу,,,обрабатывалось и выводила...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru