ReadSheet()
—————————————————————————
Window.OPEN(
Text007 +
‘@1@@@@@@@@@@@@@@@@@@@@@@@@’);
Window.UPDATE(1,0);
DELETEALL;
XlRange := XlWorkSheet.Range(GetExcelReference(5)).SpecialCells(11);
Maxi := XlRange.Row;
Maxj := XlRange.Column;
i := 1;
REPEAT
j := 1;
VALIDATE(«Row No.»,i);
REPEAT
VALIDATE(«Column No.»,j);
// RU > EXR
// «Cell Value as Text» := DELCHR(FORMAT(XlWorkSheet.Range(xlColID + xlRowID).Value),'<‘,’ ‘);
«Cell Value as Text» := COPYSTR(
DELCHR(FORMAT(XlWorkSheet.Range(xlColID + xlRowID).Value),'<‘,’ ‘),
1, MAXSTRLEN(«Cell Value as Text»));
// RU < EXR
IF «Cell Value as Text» <> » THEN BEGIN
INSERT;
END;
j := j + 1;
UNTIL j > Maxj;
i := i + 1;
Window.UPDATE(1,ROUND(i / Maxi * 10000,1));
UNTIL i > Maxi;
XlWorkBook.Close(FALSE);
XlApplication.Quit;
CLEAR(XlApplication);
Window.CLOSE;
-
July 14 2010, 10:51
Бесчисленное кол-во раз были задачи импорта/экспорта в Excel, в результате чего родилась библиотека Excel_Managment.txt , содержащая все когда-либо понадобившиеся строки.
Наиболее часто использующиеся функции
для импорта
OpenFile(FileName) — открываем Excel-файл, при пустом FileName выдает стандартное окно диалога выбора файла. При наличии нескольких листов предлагает окно выбора Листа , с которого загружать.
GetLastCell(LastColumn,LastRow) — определяем последний заполненный столбец и строку в файле, чтобы в цикле знать по какую строку/столбец искать и загружать данные
ReadField(Column,Row) — считываем ячейку
Close — закрываем файл
для экспорта
CreateBook(SheetName) — создаем Excel с листом, названным SheetName.
SetCell(ColumnChar,Row,txtValue) — помещаем в заданную ячейку текст
Перечень всех функций (названия старался дать интуитивно понятные)
RangeName
CreateBook
Close
SetForeColor
SetBackColor
SetRange
ColumnName
RangeAutofit
OpenFile
OpenFileWOUser
GiveUserControl
ReadField
CloseFile
RangeOrient
SetRow
SetFontBold
SetCellsOutlined
SetCellsWrapText
SaveWorkBook
OpenBookAndSheet
SaveGlobalBook
DeleteData
SheetCount
CheckExists
ActivateSheet
DeleteCells
DeleteCellsData
FormatCells
SetFormula
SetCell
Merge
SetCellsOutlined1
SetFont
SetFontProperties
PlaceInPages
CellSizes
GetLastCell
InsertRow
DeleteRow
SelectSheetsName
SetCellCode
SetCellInt
ShowBook
HiddenColumn
SetCenterAlignment
SetUserOFF
SetUserON
AddOutLine
ClearOutLine
EnterCellLineLite
Col2XLCol
Word
WordCount
Copy
SetCellRight
SetCellCodeRiqht
SetCellIntRight
SetCellDown
SetCellCodeDown
SetCellIntDown
GetCurrCell
DelStandWinSepCat
Я знаю, что это старый вопрос, но я добавлю ответ на тот случай, если кто-нибудь придет сюда:
Вы можете экспортировать напрямую в OpenOffice без настроек. Единственное, что вам нужно, это зайти в Инструменты> Управление таблицами стилей… и изменить существующие таблицы стилей, чтобы они открывали OpenCalc и OpenWrite вместо Excel и Word.
Примечание: прошло много времени с тех пор, как я последний раз настраивал его, но я помню, что вам, возможно, потребуется экспортировать и повторно импортировать таблицы стилей, чтобы изменить связанную программу.
Это довольно просто, и вы можете сохранить оба варианта (Экспорт в Excel / Экспорт в OpenCalc), чтобы пользователи, которым требуется MS Office, могли использовать Excel, а остальные — OpenCalc.
Этот ответ относится к функциям экспорта в Word и Excel в Dynamics Nav 5.0 и Nav 5.0SP1. Я не пробовал это в Dynamics Nav 2009 (Role Tailored Client).
One of my reader has requested to show him how to export data from Nav Journal to Excel, perform correction and import back to Navision.
So let us see how can we perform this and what are the limitations.
Open the Journal in Navision.
Arrange and show all the Fields that you want to export to Excel on the page.
Fill some sample data. Say single line of Journal, way usually you do.
Now Send to Excel using options shown in below screen.
Data will get Exported to Excel.
Have you noticed something, with the data that got exported yo Excel?
Your 2 Additional Shortcut dimension was not Exported to Excel. Customer Group Code & Area Code, why?
Since these are not the actual fields in the table and it is calculated on Page level, so you will only be able to export Dim-1 & Dim-2 your Global Dimensions which is available as Field in the Table.
Make sure you enter Dimension Values in Capitals in Excel Columns.
Now perform required changes to the Journal data.
Insert New Lines, Delete existing Lines or Edit existing Lines.
Make sure you don’t keep more than 30000 to 40000 lines, until this it works fine if more than this either performance is too slow or Navision gets hang while you copy back your data to Navision. Upto 40000 works fine have tested several time. Depending upon your system performance you can decide how much data will be ok for you.
As we have seen above my 2 additional Dimensions is missing from the exported data. We need to match the columns what we have in our Excel and sequence. So we will hide/remove the additional columns from the Journal to match the sequence from Excel columns before we copy back our data from Excel to Navision.
Select the Rows in excel containing you data excluding header columns and copy.
Return to your Journal and Paste as shown in above screen.
Your modified data is imported back to the Journal in Navision.
Now perform the Journal action way you do normally.
Published by Ashwini Tripathi
Company was incorporated under sub-section (2) of section 7 of Companies Act, 2013 and
rule 18 the Companies (Incorporation Rules, 2014.
Company Directors are (1) Ashwini Tripathi & (2) Rashmi Tripathi
We provide wide range of services currently only for Microsoft Dynamics Navision.
(1) Freelancing
(2) Virtual Employee
(3) Hourly basis service
(4) Dedicated resource
(5) Training
You can hire/ contract/ offshore work. Provide assistance and service for Implementation,
Development and Upgrade.
We are also Partner under Affiliate/MVAR Program for NAV, AX & CRM.
Currently we are servicing to only international customers.
We have associated with some Indian Companies to service International Customers.
We have provided service to Microsoft Affiliated Partners too.
We have our own customers too.
View all posts by Ashwini Tripathi
Эта статья — продолжение темы, начатой в «Excel в стиле Ultra»
Как-то я задавал вопрос о том, что делать с невидимыми экселями, которые остаются висеть в памяти из-за ошибок. Тимур Дадаханов (timur-dadakhanov@rambler.ru) прислал свое решение этого и сразу целого вороха других проблемсов. Ему слово
К сожалению, с самого начала я не заметил в вашей статье ключевую фразу «При возникновении ошибки этот невидимый эксель…». Поэтому, когда запускать эту функцию по закрытию всех невидимых экселей, я не знаю. может и не нужно вовсе. Ну, например, при выгрузки данных в шаблон Excel, ее можно применить, если предыдущая выгрузка была отменена пользователем. тогда при повторном запуске отчета, функция определит «дохлый» excel и закроет его, и новый отчет выгрузится без ошибок. В ней используется техника WinAPI. С помощью этой техники можно с навиженом, да и с любым приложением делать что угодно. Единственный минус – должен сначала загрузиться Excel, а это на первую загрузку Excel в системе требует времени.
PROCEDURE CloseDeadExcel();
VAR
objScript : Automation :‘Microsoft Script Control 1.0’.ScriptControl«;
objShell : Automation :‘Windows Script Host Object Model’.WshShell«;
xlApp : Automation :‘Microsoft Excel 11.0 Object Library’.Application«;
txtRegistryKey : Text[100];
txtRegistryType : Text[30];
txtRegistryValue : Text[1];
txtRegistryNewValue : Text[1];
BEGIN
CREATE(objScript);
CREATE(objShell);
IF NOT CREATE(xlApp) THEN
ERROR(‘Microsoft Excel не установлен!’);
//Открываем доступ к Excel макросам
txtRegistryKey := ‘HKEY_CURRENT_USERSoftwareMicrosoftOffice’ + xlApp.Version + ‘ExcelSecurityAccessVBOM’;
CLEAR(xlApp);
txtRegistryType := ‘REG_DWORD’;
txtRegistryValue := objShell.RegRead(txtRegistryKey);
txtRegistryNewValue :=‘1’;
objShell.RegWrite(txtRegistryKey,txtRegistryNewValue, txtRegistryType);
//Добавляем макросы в Excel
objScript.Language(‘VBScript’);
objScript.AddCode(‘on error resume next’);
objScript.AddCode(‘set Application=createobject(«Excel.Application»)’);
objScript.AddCode(‘set Workbook=Application.Workbooks.Add’);
objScript.AddCode(‘Set Module = Workbook.VBProject.VBComponents.Add(1)’);
objScript.AddCode(‘Module.CodeModule.AddFromString («Private Declare Function EnumWindows ‘ +
‘Lib «»user32″» (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long»)’);
objScript.AddCode(‘Module.CodeModule.AddFromString («Private Declare Function GetClassNameA Lib «»user32″» ‘ +
‘(ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long»)’);
objScript.AddCode(‘Module.CodeModule.AddFromString («Private Declare Function IsWindowVisible Lib ‘ +
‘ «»user32″» (ByVal hwnd As Long) As Boolean»)’);
objScript.AddCode(‘Module.CodeModule.AddFromString («Private Declare Function ‘ +
‘ExitProcess Lib «»kernel32″» (ByVal ExitCode As Long) As Long»)’);
objScript.AddCode(‘Module.CodeModule.AddFromString («Private Declare Function TerminateProcess Lib «»kernel32″» ‘ +
‘ (ByVal hProcess As Long, ByVal ExitCode As Long) As Long»)’);
objScript.AddCode(‘Module.CodeModule.AddFromString («Private Declare Function GetWindowThreadProcessId Lib «»user32″» ‘ +
‘(ByVal hwnd As Long, lpdwProcessId As Long) As Long»)’);
objScript.AddCode(‘Module.CodeModule.AddFromString («Private Declare Function OpenProcess Lib «»kernel32″» ‘ +
‘(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long»)’);
objScript.AddCode(‘Module.CodeModule.AddFromString («Function WindowProc(ByVal hwnds As Long, ByVal lP As Long) As Boolean’ +
‘» & chr(13) & «on error resume next» & chr(13) & ‘ +
‘» Dim mystr As String» & chr(13) & «mystr = Space(7)» & chr(13) & ‘ +
‘» GetClassNameA hwnds, mystr, 7″ & chr(13) & «If Left(mystr, 6) = «»XLMAIN»» Then» & chr(13) & ‘ +
‘» If IsWindowVisible(hwnds) <> 1 Then » & chr(13) & ‘ +
‘» if hwnds<>Application.hwnd then » & chr(13) & ‘ +
‘» GetWindowThreadProcessID hwnds,ddd» & chr(13) & ‘ +
‘» terminateprocess openprocess(2035711,0,ddd),0″ & chr(13) & ‘ +
‘» end if» & chr(13) & » end if» & chr(13) &’ +
‘» End If» & CHr(13) & «WindowProc = True» & chr(13) & «End Function»)’);
objScript.AddCode(‘Module.CodeModule.AddFromString («public sub ff» & Chr(13) & ‘ +
‘» EnumWindows AddressOf WindowProc, 0″ & Chr(13) & ‘ +
‘»end sub»)’);
//Выполняем макрос и выходим
objScript.AddCode(‘Application.Run(«ff»)’);
objScript.AddCode(‘Workbook.saved=true’);
objScript.AddCode(‘Application.Quit’);
objScript.Reset;
CLEAR(objScript);
//Закрываем доступ к Excel макросам
objShell.RegWrite(txtRegistryKey,txtRegistryValue, txtRegistryType);
CLEAR(objShell);
END;
Следующий кусочек, файл-скрипт VBS, который устанавливает у первого найденного Excel свойство Visible=TRUE. Таким образом, можно отобразить все невидимые эксели, вручную запуская этот скрипт. Вдруг там что-то нужное
ShowFirstExcel.vbs
Set Ex = GetObject(, «Excel.Application»)
Ex.Visible = True
И, наконец, самый сладкий кусочек, присланный Тимуром — это действительно ТУРБО-СТИЛЬ!!! Приведу только кусочек кода, а полный вариант отчета с использованием технологии, можно взять здесь.
OnAfterGetRecord=
BEGIN
//Индикация
intIndicatorCounter += 1;
dlgIndicator.UPDATE(1, ROUND((intIndicatorCounter * 9999) / intIndicatorTotal, 1));
xlApp.Range(‘A’+ FORMAT(intIndicatorCounter)).Value:= FORMAT(«G/L Entry».«Entry No.«) + tab +
FORMAT(«G/L Entry».«G/L Account No.«) + tab +
FORMAT(«G/L Entry».«Posting Date») + tab +
«G/L Entry».«Document No.» + tab +
«G/L Entry».Description + tab +
«G/L Entry».«User ID»;
//!!! Внимание, МАГИЯ!!!
xlApp.Range(‘A’ + FORMAT(intIndicatorCounter)).TextToColumns(xlApp.Range(‘A’ + FORMAT(intIndicatorCounter)),
1, 1, FALSE, TRUE);
END;
Navision взлетает до небес, со скоростью примерно 1000 строк/сек