C# разным способом воспринимает идентичные листы Excel.В чём проблема?

maximovega

   Хочу записать данные из базы, из четырёх табличек на четыре разных листа Excel.
Запись производится в файл, выбор которого делается при помощи идентификатора из comboBox1, для ID1 всё работает, для ID2 записываются кроме и    Код использую следующий:

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.SubstringDT_F.Columns.Count + GlobalVar.CELL_COL - 1 - 1) / colCharsetLen - 1, 1); }
finalColLetter += colCharset.SubstringDT_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;
}

kill-still

попробуй применить метод гибкого копирования. :grin:

murmashik

Отформатировал бы код что ли для начала...
На вскидку - не есть гут на каждой итерации (для каждой таблицы) создавать объекты
Excel.ApplicationClass и Excel.Workbook. Помню сталкивался с доступом к экселю из кода, было много геморроя с правильным созданием и открытием документа.
Советую посмотреть в сторону ODBC адаптера от мелкомягких для экселя. Там все проще получается.
Пишешь запрос а ля update db.table ..., где db - имя экселевского файла, а table - имя листа в документе, и радуешься жизни.

FRider

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

Alexander08

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

maximovega

Можешь это пояснить немножко подробнее? Код писали другие, но вынужден его использовать, до него опыта с C# не было совершенно... Общую картинку понял, а более существенные вещи сложно уже...

stm7473768

Код писали другие, но вынужден его использовать, до него опыта с C# не было совершенно... Общую картинку понял, а более существенные вещи сложно уже...
Э-э

kill-still

ты верно ошибся? ты же хотел написать неизысканно? :)

murmashik

Спасибо, что разрешаешь погуглить за тебя...
http://www.codeproject.com/KB/database/excel_odbc.aspx

maximovega

Я понимаю, но это всё слишком сложно. То есть непонятно, что из этого следует сделать с моим кодом? (И статья не про запись в, а про чтение из него?... :confused: )

maximovega

   Плюс, неясно: раньше ведь работало для 4 листов одинаково, теперь перестало внезапно работать только для некоторых, когда между успешным и неуспешным запусками файл даже не открывался, соответственно, листы были нетронуты. Раз проблема в форматировании, Ctrl+C - Ctrl+V только форматы будет достаточно? :)

maximovega

И, добавление: если запускать запись для листов отдельно - сработает.

kill-still

слушай, смирись уже. никто на этом форуме в здравом уме по собственной воле больше не будет тебе помогать.
открой уже для себя тематические форумы, и показывай свою спесь там. посмотришь, как быстро тебя тут отошьют:
http://forum.vingrad.ru/forum/MSOffice.html
(I) она всех игнорит? :)

maximovega

UP! Still holds... :)

maximovega

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

saveliev_a

Тебе же уже , только ты его проигнорировал.
Оставить комментарий
Имя или ник:
Комментарий: