|
![]() |
#1 |
Moderator
|
911 символов
Как выясняется, CopyFromRecordset загибается при длине строки более 911 символов (просто какой-то телефонный "привет" от службы спасения!
![]() О проблеме знают в мире: http://www.google.ru/search?hl=ru&q=...1&lr=&aq=f&oq= но пока ничего утешительного я не нашёл. |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от Gustav
![]() Как выясняется, CopyFromRecordset загибается при длине строки более 911 символов (просто какой-то телефонный "привет" от службы спасения!
![]() О проблеме знают в мире: http://www.google.ru/search?hl=ru&q=...1&lr=&aq=f&oq= но пока ничего утешительного я не нашёл. Using ADO (ActiveX 2.8 Object Lib) with Excel 2003, I extract data from a worksheet and copy it to another worksheet in the same workbook. In Office 2007 everything is fine, but in Office XP and Office 2003 the CopyFromRecordset fails if a field has more than 911 bytes. Т.е. в 2007 офисе эта проблема исправлена... |
|
![]() |
#3 |
Moderator
|
Получается, что так. Интересно, что ее также нет в более ранней Excel 2000 - я проверил, запустив там такой VBA-код с http://support.microsoft.com/kb/818808/en-us :
Код: Sub XLTest() Dim aValues(4) aValues(0) = "Test1" aValues(1) = "Test2" aValues(2) = "Test3" MsgBox "First the Good range set." aValues(3) = String(911, 65) Range("A1:D1").Value = aValues MsgBox "Now the bad range set." aValues(3) = String(912, 66) Range("A2:D2").Value = aValues 'вызывает ошибку End Sub Код: Range("A2").Value = String(912, 66) ' нормально поместит 912 букв B в ячейку |
|
![]() |
#4 |
Moderator
|
Цитата:
Любой, который пишет поячеечно. Например, при помощи класса ComExcelDocument_RU. Если у вас не десятки тысяч записей (иначе будет долго), то можно попробовать. |
|
![]() |
#5 |
Участник
|
ок, спасибо, буду пробовать. Нет, такого количества строк не набирается, отчет снимается ежедневно, поэтому ComExcelDocument_RU можно рассмотреть как альтернативу.
|
|
![]() |
#6 |
Moderator
|
Цитата:
X++: static void Job148(Args _args) { COM rstAxa; COM flds, fld; COM xlApp; COM wbks, wbk; COM wkss, wks; COM rng; str strValue; str strFormula; COMVariant sep; #define.xlPasteValues(-4163) #define.xlListSeparator(5) int adoTypeToExcel(str _type) { switch (_type) { case 'num' : return 5; // adDouble case 'str' : return 8; // adBSTR case 'date': return 133; // adDBDate } return 8; } ; rstAxa = new COM('ADODB.Recordset'); flds = rstAxa.Fields(); flds.Append('str1' , adoTypeToExcel('str' )); flds.Append('str2' , adoTypeToExcel('str' )); flds.Append('str3' , adoTypeToExcel('str' )); flds.Append('str4' , adoTypeToExcel('str' )); flds.Append('str5' , adoTypeToExcel('str' )); flds.Append('str6' , adoTypeToExcel('str' )); flds.Append('str7' , adoTypeToExcel('str' )); flds.Append('str8' , adoTypeToExcel('str' )); flds.Append('str9' , adoTypeToExcel('str' )); flds.Append('str10', adoTypeToExcel('str' )); flds.Append('str11', adoTypeToExcel('str' )); rstAxa.Open(); xlApp = new COM('Excel.Application'); // создаем формулу с правильным разделителем списка (запятой или точкой с запятой) sep = xlApp.International(#xlListSeparator); strFormula = strFmt('=CONCATENATE(RC[-10]%1RC[-9]%1RC[-8]%1RC[-7]%1RC[-6]%1RC[-5]%1RC[-4]%1RC[-3]%1RC[-2]%1RC[-1])', sep.bStr()); strValue = strRep('1234567890123, ', 60); rstAxa.AddNew(); fld = flds.Item('str1' ); fld.Value(strValue); fld = flds.Item('str2' ); fld.Value(strValue); fld = flds.Item('str3' ); fld.Value(strValue); fld = flds.Item('str4' ); fld.Value(strValue); fld = flds.Item('str5' ); fld.Value(strValue); fld = flds.Item('str6' ); fld.Value(strValue); fld = flds.Item('str7' ); fld.Value(strValue); fld = flds.Item('str8' ); fld.Value(strValue); fld = flds.Item('str9' ); fld.Value(strValue); fld = flds.Item('str10'); fld.Value(strValue); fld = flds.Item('str11'); fld.Value(strFormula); rstAxa.Update(); strValue = strRep('ABCDEFGHIJKLM, ', 60); rstAxa.AddNew(); fld = flds.Item('str1' ); fld.Value(strValue); fld = flds.Item('str2' ); fld.Value(strValue); fld = flds.Item('str3' ); fld.Value(strValue); fld = flds.Item('str4' ); fld.Value(strValue); fld = flds.Item('str5' ); fld.Value(strValue); fld = flds.Item('str6' ); fld.Value(strValue); fld = flds.Item('str7' ); fld.Value(strValue); fld = flds.Item('str8' ); fld.Value(strValue); fld = flds.Item('str9' ); fld.Value(strValue); fld = flds.Item('str10'); fld.Value(strValue); fld = flds.Item('str11'); fld.Value(strFormula); rstAxa.Update(); wbks = xlApp.Workbooks(); wbk = wbks.Add(); wkss = wbk.Worksheets(); wks = wkss.Item(1); rng = wks.Range('A1'); rng.CopyFromRecordset(rstAxa); // оживление формул и вычисление значений rng = wks.Range('K1:K2'); rng.FormulaR1C1( rng.Value2() ); rng.Copy(); rng.PasteSpecial(#xlPasteValues); xlApp.CutCopyMode(false); rng = wks.Columns(); rng = COM::createFromVariant(rng.Item('A:J')); rng.Delete(); rstAxa.Close(); xlApp.Visible(true); } X++: rng = wks.Columns();
rng = COM::createFromVariant(rng.Item('A:J'));
rng.Delete(); |
|
Теги |
ado, excel, экспорт |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|