|
|
|
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
|
|||
|---|---|---|---|
|
#18+
Хочу записать данные из базы, из четырёх табличек на четыре разных листа 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# якобы чувствителен к нему. Я скопировала формат с ранних файлов, сохранённых под другими именами, но не помогло! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2011, 11:41 |
|
||
|
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
|
|||
|---|---|---|---|
|
#18+
UP!!! Подскажите, пожалуйста, куда хотя бы "уткнуться", любые идеи. Где искать или, раз проблема действительно "неподъёмная", куда можно ещё обратиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2011, 19:13 |
|
||
|
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
|
|||
|---|---|---|---|
|
#18+
UP!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2011, 11:57 |
|
||
|
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
|
|||
|---|---|---|---|
|
#18+
Проверьте, в первую очередь, сам комбобокс - в нем точно всего две записи "ID1" и "ID2" ? Проверьте на сервере наличие и неповрежденность таблиц БД "ID2RE_BASE_NB" и "ID2RE_BASE_ER". Если формат файлов "ID1_BASE.xls" и "ID2_BASE.xls" одинаков, попробуйте для тестирования заменить второй первым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2011, 12:16 |
|
||
|
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
|
|||
|---|---|---|---|
|
#18+
Спасибо большое за ценные указания! :) Первый и третий проверила, тестировала, не получилось. :( Второй остался, но я его не совсем поняла: как проверить, не повреждены ли таблички? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 11:51 |
|
||
|
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
|
|||
|---|---|---|---|
|
#18+
Дополню, кажется, это важная информация: четыре раза (в точности при попытках записи листов) в процессе работы программа предупреждает, что файл уже открыт пользователем (что неправда, я его закрывала, разлогинивалась, перезагружала даже компьютер и мне переустанавливали Office). Скопировав файл на локальный диск и переписав пути к нему в коде соответственно, все заработало. Что тут делать, чтобы работал и на предыдущем месте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2011, 19:42 |
|
||
|
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
|
|||
|---|---|---|---|
|
#18+
Мне посоветовали лично перенести 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. Сработало. Объясните, пожалуйста, почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2011, 21:08 |
|
||
|
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
|
|||
|---|---|---|---|
|
#18+
UP! Chochu na budusheye ponimat' problematiku i umet ispravlyat'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2011, 12:29 |
|
||
|
C# разным способом воспринимает идентичные листы Excel.В чём проблема?
|
|||
|---|---|---|---|
|
#18+
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? Находятся ли страницы с нужными именами? Верный ли диапазон выделяется для вставки данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2011, 11:47 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=37526232&tid=1342575]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
35ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 319ms |

| 0 / 0 |
