Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
2 / 2 / 2
Регистрация: 24.04.2016
Сообщений: 191
.NET 4.x

Ошибка при пересохранении файла Excel

20.11.2016, 18:36. Показов 2759. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Workbook|*.xls", ValidateNames = true })
            {
                if (sfd.ShowDialog() == DialogResult.OK )
                {
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
 
wb.SaveAs(sfd.FileName, XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, true, false, XlSaveAsAccessMode.xlExclusive, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);

возникает ошибка если я пересохраняю файл и он открыт, выскакивает сообщения в котором говорится что неполучается получить доступ к файлу, как это можно исправить?? как реализовать проверку отрыт ли файл? имя файла может быть разным,,,
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2016, 18:36
Ответы с готовыми решениями:

Ошибка при пересохранении изображения
Подскажите. Я беру файл с папки и изменяю ее дальше хочу сохранить так чтобы он заменил тот старый но выводит ошибку. Сохраняю в другое...

Ошибка при отказе от сохранения файла Excel
Народ, привет. Такой трабл возник, после изменений в файле пытаюсь его сохранить, если в диалоговом окне соглашаюсь с сохранением, то все...

Excel ошибка при открытие 2-го файла
Всем доброго времени суток. Прошу прощения сразу если подобная тема обсуждалась или если тема не в том разделе. Программа открывает...

19
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
20.11.2016, 18:59
Lord_J, в блоке catch лови это исключение
C#
1
2
3
4
5
6
7
8
                catch (System.IO.IOException ex)
                {
                    MessageBox.Show(ex.Message);
                    if (ex.HResult == -2147024864)
                    {
                        // тут логика для попытки открытия занятого файла
                    }
                }
0
2 / 2 / 2
Регистрация: 24.04.2016
Сообщений: 191
20.11.2016, 19:30  [ТС]
Serg34, как мне это сделать вот коротко мой код


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Workbook|*.xls", ValidateNames = true })
            {
                if (sfd.ShowDialog() == DialogResult.OK )
                {
 
  Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
                    Workbook wb = ObjExcel.Workbooks.Add(XlSheetType.xlWorksheet);
                    Worksheet ws = (Worksheet)ObjExcel.ActiveSheet;
                    ObjExcel.Visible = false;
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
 foreach (ListViewItem item in listView1.Items)
                    {
,,,,,,,,
 }
куда вставить catch???
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
20.11.2016, 20:02
Цитата Сообщение от Lord_J Посмотреть сообщение
куда вставить catch???
try-catch
блок try - блок с попыткой совершить что-либо.
блок cath - блок с инструкцией что делать, если что-то по какой-либо причине (Exception) не получается.
Но лучше в нэте погугли еще, хз как такие вещи объяснить, типа руль - это элемент управления машиной
Не огорчайся, но в нэте и на форуме полно информации
Цитата Сообщение от Lord_J Посмотреть сообщение
как мне это сделать
Сделать что именно?
Чего ты хочешь добиться если твой файл занят?
0
2 / 2 / 2
Регистрация: 24.04.2016
Сообщений: 191
20.11.2016, 20:06  [ТС]
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
using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Workbook|*.xls", ValidateNames = true })
{
try{
if (sfd.ShowDialog() == DialogResult.OK )
{
 
Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
Workbook wb = ObjExcel.Workbooks.Add(XlSheetType.xlWorksheet);
Worksheet ws = (Worksheet)ObjExcel.ActiveSheet;
ObjExcel.Visible = false;
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
foreach (ListViewItem item in listView1.Items)
{
,,,,,,,,
}
}
wb.SaveAs(sfd.FileName, XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, true, false, XlSaveAsAccessMode.xlExclusive, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);
}
 catch (System.IO.IOException ex)
                {
                    MessageBox.Show(ex.Message);
                    if (ex.HResult == -2147024864)
                    {
                       MessageBox...
                    }
                }
пробовал так не получается,,,некогда с этим еще не сталкивался поможетеSerg34, ???
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
20.11.2016, 20:29
Лучший ответ Сообщение было отмечено Lord_J как решение

Решение

Lord_J, просто объясни что должно происходить, если файл занят. Без кода.
Должно появиться сообщение пользователю или еще что?

Добавлено через 17 минут
Lord_J, Попробуй так:
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
Excel.Application excelApp = null;
Excel.Workbook excelBook = null;
try
{
    excelApp = new Excel.Application { Visible = false };
    excelBook = excelApp.Workbooks.Open(fileName);
    ...
    
}
catch (System.IO.IOException ex) // блок для ошибки открытия файла
{
       if (ex.HResult == -2147024864)
            MessageBox.Show("Файл занят");
        else
            MessageBox.Show(ex.Message);
}
catch (Exception ex) { MessageBox.Show(ex.Message); } // блок для всех остальных ошибок
finally // блок, выполняющийся в любом случае
{
    if (excelBook != null) excelBook.Close(SaveChanges: false);
    if (excelApp != null)
    {
        excelApp.Quit();
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(excelApp);
    }
}
Или подкорректируй под свои нужды
1
2 / 2 / 2
Регистрация: 24.04.2016
Сообщений: 191
21.11.2016, 12:21  [ТС]
Serg34, Вы гений))) сделал все как вы сказали немного подшаманил код подстроил под себя и вуоля)))) все работает)) спс)))

Возникла проблема одна,,,все хорошо сохраняется но процесс занимает время сохранения файла,,,как теперь можно этот процесс ожидания заменить на progressbar???
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
21.11.2016, 12:28
Lord_J, Пожалуйста
Спасибки, кстати, можно еще кнопкой "Спасибо" делать
А что за progressbaк?
1
2 / 2 / 2
Регистрация: 24.04.2016
Сообщений: 191
21.11.2016, 12:34  [ТС]
ProgressBar

Добавлено через 4 минуты
И еще заметил что процесс после завершения все равно висит
Хотя я его закрывал
C#
1
2
 wb.SaveAs(sfd.FileName, XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, true, false, XlSaveAsAccessMode.xlExclusive, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);
ObjExcel.Quit();
Может закрывать нужно по другому?
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
21.11.2016, 12:37
Lord_J, Если тебе нужно показывать только прогресс сохранения (остальное у тебя мгновенно происходит) то показывай ProgressBar со свойством Style = Continuous.
Или в отдельном потоке делай изменение Excel
Цитата Сообщение от Lord_J Посмотреть сообщение
Может закрывать нужно по другому?
Попробуй как я писал выше в блоке finally
1
2 / 2 / 2
Регистрация: 24.04.2016
Сообщений: 191
21.11.2016, 12:54  [ТС]
Serg34, Мне нужно показывать только процесс сохранения,,но честно говоря с этим элиментном практический не работал применял его как в качестве заставки...
Можете описать код чтобы я его применил к своему? если вам не сложно,заранее спасибо
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
21.11.2016, 18:42
Lord_J, Сам процесс сохранения в процентах ты не узнаешь, поэтому стиль прогрессбара делаем Marquee (в прошлый раз я неправильно написал)
Попробовал выполнить стандартными средствами - не получается, нужно делать асинхронную операцию
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private async void btSave_ClickAsync(object sender, EventArgs e)
        {
            try
            {
                btSave.Enabled = false; // блокируем элементы управления, которыми пользователь может влиять на сохранение
                progressBar1.Visible = true;
                await Task.Factory.StartNew(() => Save()); // создаем и запускаем асинхронную задачу
            }
            finally
            {
                btSave.Enabled = true;// разблокируем элементы управления
                progressBar1.Visible = false;
            }
        }
 
        private void Save()
        {
            Thread.Sleep(2000);
        }
В принципе все просто, но если ты не новичок
Вот проект-образец
WindowsFormsApplication1.rar
0
2 / 2 / 2
Регистрация: 24.04.2016
Сообщений: 191
21.11.2016, 19:06  [ТС]
Не получилось,,,,при экспорте она просто застывает
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
21.11.2016, 19:08
Покажи код экспорта и запуска экспорта или проект скинь
0
2 / 2 / 2
Регистрация: 24.04.2016
Сообщений: 191
21.11.2016, 19:14  [ТС]
Serg34, застывает вовремя цыкла, как можно это все сделать в цикле?

Добавлено через 5 минут
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
  private async void button6_Click(object sender, EventArgs e)
        {
 
            using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Workbook (*.xls)|*.xls", ValidateNames = true })
            {
 
                Microsoft.Office.Interop.Excel.Application ObjExcel = null;
                Workbook wb = null;
 
 
                ObjExcel = new Microsoft.Office.Interop.Excel.Application();
                wb = ObjExcel.Workbooks.Add(XlSheetType.xlWorksheet);
                Worksheet ws = (Worksheet)ObjExcel.ActiveSheet;
                ObjExcel.Visible = false;
                try
                {
                    await Task.Factory.StartNew(() => Save());
                    if (sfd.ShowDialog() == DialogResult.OK)
                    {
 (ws.Cells[1, 1] ,,,,
                        (ws.Cells[1, 2] ,,,,
                        (ws.Cells[1, 3] ,,,,
                        (ws.Cells[1, 4],,,,
 int i = 3;
                       
 
 
                        foreach (ListViewItem item in listView1.Items)
                        {
                           
 
                            ws.Cells[i, 1] = item.SubItems[0].Text;
 ws.Cells[i, 2] = item.SubItems[0].Text;
 ws.Cells[i, 3] = item.SubItems[0].Text;
                     i**;
}
 catch
                (System.IO.IOException ex)
{
....
}
 
 
это в крации кнопка экспорта в экзель[nick]Serg34[/nick],
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
21.11.2016, 19:34
Лучший ответ Сообщение было отмечено Lord_J как решение

Решение

Lord_J, Внутри метода Save из моего примера делай все что хочешь

Добавлено через 2 минуты
Не, не, не. Вся логика в методе Save.
А в button6_Click мы в отдельном потоке его вызываем (await Task.Factory.StartNew(() => Save())

Добавлено через 17 минут
Lord_J, То есть нужно так:
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
51
52
private async void button6_Click(object sender, EventArgs e)
{
    try
    {
        button6.Enabled = false; // блокируем элементы управления, которыми пользователь может влиять на сохранение
        listView1.Enabled = false; //при необходимости, если listView1 не только для чтения
        progressBar1.Visible = true;
        
        await Task.Factory.StartNew(() => Export()); // создаем и запускаем асинхронную задачу
    }
    finally
    {
        button6.Enabled = true;// разблокируем элементы управления
        listView1.Enabled = true;
        progressBar1.Visible = false;
    }
}
 
private void Export()
{
 
    using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Workbook (*.xls)|*.xls", ValidateNames = true })
    {
        if (sfd.ShowDialog() != DialogResult.OK) return; // если пользователь передумал сохранять, то сразу выходим
 
        Microsoft.Office.Interop.Excel.Application ObjExcel = null;
        Workbook wb = null;
        try // try перед попыткой открыть файлы, так как она тоже может быть безуспешной
        {
            ObjExcel = new Microsoft.Office.Interop.Excel.Application();
            wb = ObjExcel.Workbooks.Add(XlSheetType.xlWorksheet);
            Worksheet ws = (Worksheet)ObjExcel.ActiveSheet;
            ObjExcel.Visible = false;
           
            (ws.Cells[1, 1] ,,,,
            (ws.Cells[1, 2] ,,,,
            (ws.Cells[1, 3] ,,,,
            (ws.Cells[1, 4],,,,
            int i = 3;
 
            foreach (ListViewItem item in listView1.Items)
            {
                ws.Cells[i, 1] = item.SubItems[0].Text;
                ws.Cells[i, 2] = item.SubItems[0].Text;
                ws.Cells[i, 3] = item.SubItems[0].Text;
                i**;
            }
        }
         catch (System.IO.IOException ex)
        {
        ....
        }
1
2 / 2 / 2
Регистрация: 24.04.2016
Сообщений: 191
22.11.2016, 11:52  [ТС]
Serg34, Спасибо))) Я сделал немного по другому)) я подумал над вашим советом
"Не, не, не. Вся логика в методе Save.
А в button6_Click мы в отдельном потоке его вызываем (await Task.Factory.StartNew(() => Save())"

И сделал так...
В самом цикле
C#
1
2
3
4
5
6
7
 foreach (ListViewItem item in listView1.Items)
            {
                ws.Cells[i, 1] = item.SubItems[0].Text;
                ws.Cells[i, 2] = item.SubItems[0].Text;
                ws.Cells[i, 3] = item.SubItems[0].Text;
                i**;
            }
Я добавил
await Task.Factory.StartNew(() => Save()); // создаем и запускаем асинхронную задачу

То есть получилось так
C#
1
2
3
4
5
6
7
8
 foreach (ListViewItem item in listView1.Items)
            {
                ws.Cells[i, 1] = item.SubItems[0].Text;
                ws.Cells[i, 2] = item.SubItems[0].Text;
                ws.Cells[i, 3] = item.SubItems[0].Text;
                await Task.Factory.StartNew(() => Save());
                i**;
            }
А в
C#
1
2
3
4
private void Save()
        {
            Thread.Sleep(2000);
        }
Вместо 2000 указал 20
Таким обзором выполняется цикл и все проходит так как нужно) конечно мне хотелось чтобы показывался сам процесс сохранения, но как вы сказали количество узнать невозможно это так,,,,
У меня еще к вам два вопроса
1 - Каков метод все же лучше,который я переделал или же тот который вы написали последним private void Export()
2 - Как можно добавить к ProgressBar,Label, Чтобы получилось вроде этого "Выполняется экспортирование в Excel." "Выполняется экспортирование в Excel.." "Выполняется экспортирование в Excel..." то есть чтобы было три точки вроле загрузке
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
22.11.2016, 20:30
Lord_J,
1) Строчка Thread.Sleep(2000) демонстрационная - она используется для симуляции полезной работы программы при долгих процессах, либо если ты осознанно не хочешь, чтобы какой-то метод выполнялся слишком быстро (например, им можно регулировать скорость игры). Этот метод заставляет твою программу уснуть, то есть выполнить паузу на указанное число миллисекунд, освобождая процессор другим процессам. В реальных приложениях его использовать сам понимаешь нельзя!!!
2) Посмотри вот это видео про потоки. Поток - это как бы последовательность методов (да простят меня боги программирования за такую формулировку). То есть после одного метода последовательно следует второй, затем третий и т.д. Ты же хочешь, чтобы и твоя форма с прогрессбаром обновлялась (ползунок полз) и метод при этом выполнялся. Это уже распаралеливание задач. Поэтому чтобы это произошло, необходимо весь длительный метод выполнять в отдельном потоке, как я писал в посте 16, предварительно блокируя доступ к элементам управления, чтобы те не испортили уже формирующийся отчет.
3)
Цитата Сообщение от Lord_J Посмотреть сообщение
вы сказали количество узнать невозможно
Я говорил про количество процентов сохранения файла (процесс, который выполняет сам Excel.Save()). Количество же итераций при экспорте - это не проблема. Как я понимаю - у тебя это listView1.Items.Count
Но на твоем месте я бы сейчас с этим со всем не экспериментировал. Узнай вначале немного про потоки
А если не устраивает скорость экспорта, Excel можно ускорить, например, так
C#
1
2
3
4
5
xlApp.Calculation = Excel.XlCalculation.xlCalculationManual;
xlApp.ScreenUpdating = false;
//экспорт
xlApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
xlApp.ScreenUpdating =  true;
1
2 / 2 / 2
Регистрация: 24.04.2016
Сообщений: 191
23.11.2016, 12:38  [ТС]
Serg34, Спасибо за вашу помощь видно человек вы опытный) Возможно когда нибудь и я стану таким

Я както хотел сделать сортировку в listview по колонкам,,,искал методы в поисковиках но чтото толковое найти не удалось,,,,читал что это делается с помощью ColumnClick но как именно сделать я так и не понял
Нужна сортировка в порядке убывания и возрастания как буквенная так и цифирная

Можете подсказать как это сделать ???
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
23.11.2016, 23:34
Цитата Сообщение от Lord_J Посмотреть сообщение
видно человек вы опытный)
Я года два всего программированием занимаюсь на досуге, причем первый год тоже как ты старался написать что-дь такое эдакое, чтобы и прогрессбар красивый, и чтобы панель выезжала с анимацией и прозрачную форму с непрозрачными кнопками и всякую такую красотень. Так вот сейчас (спустя второй год) я твердо могу сказать что тот год прошел практически впустую - ничего из тех нароботок толком не работает, код совершенно нечитабельный, все объекты (если они еще есть, часто это был просто спагетти-код в каком-дь методе button7_Click) сильно связаны друг с другом. Вобщем, спустя год я все-таки начал изучать язык по книгам, видео, и понял, что свои старания нужно было направить на изучение основ языка, ООП, паттернов, антипаттернов, связности и связанности и т.д.
Пример из жизни: один мой знакомый хотел научиться играть на барабанах. Он все гнался за дорогущими установками, отдавал немало монет за это, чтобы получить хороший звук. Спустя годы, когда желание уже отпало, он с осознал, что деньги нужно было вкладывать в себя - то есть в обучение, потому как дело в кривых руках.
Также и тебе советую поступить: для начала прочитай Шилдта, посмотри видеокурс этот можно еще этот
И привыкни контролы именовать
А потом вернись к этой теме - сам все поймешь

По поводу сортировки, я с этим не сталкивался. Вот бегло в нэте нашел
Если непонятно чего, то лучше тему отдельную создай
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2016, 23:34
Помогаю со студенческими работами здесь

Ошибка при сохранении Excel файла
Здравствуйте, помогите пожалуйста решить проблему: С помощью Visual Basic создаю excel файл и сохраняю его в нужной папке. Затем при...

Ошибка Excel при создании файла
Прога выдает ошибку (см. скрин) вот код. void StartAndCreateFile(string fileName) { try { ...

Ошибка eolesyserror при открытии файла Excel
Доброго времени суток всем. Возникла проблема в довольно таки банальной операции, как чтение данных из файла. При отладке программа...

Работа с Excel: ошибка при открытии сохраненного файла
Будьте добры, помогите решить такую проблему. Сохраняю итоги в файл Excel. Дак вот при открытие сохраненного файла в формате .xlsx...

Ошибка при открытии сохраненного текстового файла в Excel
Коллеги, добрый день. Столкнулся с проблемкой: При открытии в почте экселевского файла полученного из текстового появляется ошибка: Не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru