powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C# разным способом воспринимает идентичные листы Excel.В чём проблема?
9 сообщений из 9, страница 1 из 1
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
    #37444651
Flossy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу записать данные из базы, из четырёх табличек на четыре разных листа Excel.
Запись производится в файл, выбор которого делается при помощи идентификатора из comboBox1, для ID1 всё работает, для ID2 записываются кроме #2 и #4.

Код использую следующий:

code:

public const string Conn1 = "Data Source=WWYYXX;" + "Database=MTTools;" + "Integrated Security=SSPI;" + "connection timeout= 60000";
public const string ID1_Path_XLS_01 = "M:\\ANALYSIS\\2011\\ID1_BASE.xls";
public const string ID2_Path_XLS_01 = "M:\\ANALYSIS\\2011\\ID2_BASE.xls";

string SQLQuery;
string sheetname;
string Path_XLS;

SqlCommand cmd_all;
SqlCommand cmd_nb;
SqlCommand cmd_y;
SqlCommand cmd_yer;

IDENT = comboBox1.Text;
conn = new SqlConnection(GlobalVar.Conn1);
DataSet DataSet_FINAL = new DataSet();

if (IDENT == "ID1")
{ Path_XLS = GlobalVar.ID1_Path_XLS_01; }
else { Path_XLS = GlobalVar.ID2_Path_XLS_01; }

conn.Open();
SQLQuery = "SELECT * FROM MTTools.dbo.[" + IDENT + "RE_BASE] WHERE CD = '" + DateConvertToString(DateVar("END")) + "' ";
cmd_all = new SqlCommand(SQLQuery, conn);
SQLQuery = "SELECT * FROM MTTools.dbo.[" + IDENT + "RE_BASE_NB] WHERE CD = '" + DateConvertToString(DateVar("END")) + "' ";
cmd_nb = new SqlCommand(SQLQuery, conn);

SQLQuery = "SELECT * FROM MTTools.dbo.[" + IDENT + "RE_BASE_YEAR] WHERE CD = '" + DateConvertToString(DateVar("END")) + "' ";
cmd_y = new SqlCommand(SQLQuery, conn);
SQLQuery = "SELECT * FROM MTTools.dbo.[" + IDENT + "RE_BASE_ER] WHERE CD = '" + DateConvertToString(DateVar("END")) + "' ";
cmd_yer = new SqlCommand(SQLQuery, conn);
conn.Close();

SqlDataAdapter Adapter = new SqlDataAdapter();

Adapter.SelectCommand = cmd_all;
Adapter.Fill(DataSet_FINAL, "RE_BASE");
Adapter.SelectCommand = cmd_nb;
Adapter.Fill(DataSet_FINAL, "RE_BASE_NB");
Adapter.SelectCommand = cmd_y;
Adapter.Fill(DataSet_FINAL, "RE_BASE_YEAR");
Adapter.SelectCommand = cmd_yer;
Adapter.Fill(DataSet_FINAL, "RE_BASE_ER");

foreach (System.Data.DataTable DT_F in DataSet_FINAL.Tables)
{
object[,] data = new object[DT_F.Rows.Count + 1, DT_F.Columns.Count];
for (int col = 0; col < DT_F.Columns.Count; col++)
{ data[0, col] = DT_F.Columns[col].ColumnName; }
for (int col = 0; col < DT_F.Columns.Count; col++)
{
for (int row = 0; row < DT_F.Rows.Count; row++)
{ data[row + 1, col] = DT_F.Rows[row].ItemArray[col]; }
}
string finalColLetter = string.Empty;
string colCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int colCharsetLen = colCharset.Length;
string StartColLetter = colCharset.Substring(GlobalVar.CELL_COL - 1, 1); string StartColNumber = Convert.ToString(GlobalVar.CELL_ROW);
if (DT_F.Columns.Count + GlobalVar.CELL_COL - 1 > colCharsetLen)
{ finalColLetter = colCharset.Substring((DT_F.Columns.Count + GlobalVar.CELL_COL - 1 - 1) / colCharsetLen - 1, 1); }
finalColLetter += colCharset.Substring((DT_F.Columns.Count + GlobalVar.CELL_COL - 1 - 1) % colCharsetLen, 1);

Excel.ApplicationClass app = new ApplicationClass();

Excel.Workbook theWorkbook = app.Workbooks.Open(Path_XLS, 0, false, 5, "",
"", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);

switch (DT_F.TableName)
{
case "RE_BASE": sheetname = "DB"; break;
case "RE_BASE_NB": sheetname = "DB_NB"; break;
case "RE_BASE_YEAR": sheetname = "DB_Y"; break;
case "RE_BASE_ER": sheetname = "DB_YExR"; break;
default: sheetname = "NULL"; break;
}

Excel.Worksheet sheet = (Excel.Worksheet)theWorkbook.Sheets[sheetname];

Excel.Range range = sheet.get_Range("B11:AA50000", Type.Missing);
range.Value2 = null;

string excelRange = string.Format(StartColLetter + StartColNumber + ":{0}{1}", finalColLetter, DT_F.Rows.Count + GlobalVar.CELL_ROW);
sheet.get_Range(excelRange, Type.Missing).Value2 = data;

theWorkbook.RefreshAll();
theWorkbook.Save();
app.Quit();
}

Дополнительно вспомнилось, что файл ранее (когда код работал) был тот же самый. Всегда запускался тот же самый код, записывал в файл новые данные, файл сохранялся под другим именем, но рабочий оставался тем же. Единственное: он быстро увеличивался в размерах, придавались дополнительные листы, сложные вычисления. Ориентировочно вспоминаю, что работать стал плохо, когда достиг размера около 15 мегабайт.

Можно что-то сделать, не трогая код? Язык программирования вижу практически впервые в жизни, файлы переняла от предшественников на работе, в мой функционал входит только запускать их... Можно сказать, за неделю поняла только, что код четыре раза открывает файл... Единственное, что мне советовали в других местах - изменить формат на листе, потому что C# якобы чувствителен к нему. Я скопировала формат с ранних файлов, сохранённых под другими именами, но не помогло!
...
Рейтинг: 0 / 0
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
    #37495869
Flossy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UP!!!

Подскажите, пожалуйста, куда хотя бы "уткнуться", любые идеи. Где искать или, раз проблема действительно "неподъёмная", куда можно ещё обратиться?
...
Рейтинг: 0 / 0
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
    #37519518
Flossy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UP!!!
...
Рейтинг: 0 / 0
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
    #37519582
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверьте, в первую очередь, сам комбобокс - в нем точно всего две записи "ID1" и "ID2" ?
Проверьте на сервере наличие и неповрежденность таблиц БД "ID2RE_BASE_NB" и "ID2RE_BASE_ER".
Если формат файлов "ID1_BASE.xls" и "ID2_BASE.xls" одинаков, попробуйте для тестирования заменить второй первым.
...
Рейтинг: 0 / 0
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
    #37525145
Flossy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое за ценные указания! :)

Первый и третий проверила, тестировала, не получилось. :( Второй остался, но я его не совсем поняла: как проверить, не повреждены ли таблички?
...
Рейтинг: 0 / 0
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
    #37526232
Flossy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дополню, кажется, это важная информация: четыре раза (в точности при попытках записи листов) в процессе работы программа предупреждает, что файл уже открыт пользователем (что неправда, я его закрывала, разлогинивалась, перезагружала даже компьютер и мне переустанавливали Office). Скопировав файл на локальный диск и переписав пути к нему в коде соответственно, все заработало. Что тут делать, чтобы работал и на предыдущем месте?
...
Рейтинг: 0 / 0
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
    #37534335
Flossy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне посоветовали лично перенести

Excel.ApplicationClass app = new ApplicationClass();

Excel.Workbook theWorkbook = app.Workbooks.Open(Path_XLS, 0, false, 5, "",
"", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);

перед цикл, а

theWorkbook.RefreshAll();
theWorkbook.Save();
app.Quit();

за цикл. И сказали, не было бы лишним закрыть файл с Close.

Сработало.

Объясните, пожалуйста, почему?
...
Рейтинг: 0 / 0
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
    #37560724
Flossy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UP!

Chochu na budusheye ponimat' problematiku i umet ispravlyat'.
...
Рейтинг: 0 / 0
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
    #37562641
Xordal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FlossyМне посоветовали лично перенести

Excel.ApplicationClass app = new ApplicationClass();

Excel.Workbook theWorkbook = app.Workbooks.Open(Path_XLS, 0, false, 5, "",
"", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);

перед цикл, а

theWorkbook.RefreshAll();
theWorkbook.Save();
app.Quit();

за цикл. И сказали, не было бы лишним закрыть файл с Close.

Сработало.

Объясните, пожалуйста, почему?
Потому что вам нет необходимости несколько раз открывать файл, достаточно одного раза, точно также как и закрывать. А насчет того, почему именно сейчас перестало работать: вы пробовали дебаггером пройтись по коду? Что происходит для #2 и #4? Находятся ли страницы с нужными именами? Верный ли диапазон выделяется для вставки данных?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C# разным способом воспринимает идентичные листы Excel.В чём проблема?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]