09. januar 2004 - 13:40Der er
8 kommentarer og 1 løsning
Delphi + excel
Hej,
er der nogen der kan hjælpe mig med at åbne en .csv fil i excel fra delphi 7?
jeg har en semikolon-separeret tekstfil (.csv) til rådighed! jeg vil nu gerne fra mit delphi-program åbne Excel og få Excel til at åbne min .csv fil!
har kigget under fanebladet servers og set der ligger noget som hedder TExcelApplication og ExcelOLEObject, men er på rimelig bar bund på dette område...
er i fuldt gang med at pille :) har fundet ud af hvordan man læser sin fil ind - er nu igang med at se hvordan man manipulerer de forskellige cells og deres indhold!
Jeg har lige lavet et delphi program som generere et Excel dokument med mange Sheets, som indeholder variable, headers, formateringskoder og lignende. Har dog ingen erfaring med import af tekstfiler. Hvis du er intereseret kan jeg lave et simpelt eksempel, men du skal selv gætte dig til hvordan koderne til import virker vha. at indspille macro i Excel. Læg en beked hvis du vil have eksemplet. Hvad med en macro i Excel som udfører det du ønsker ? Det er meget lættere. //PZ
det skal være igennem delphi desværre, men jeg har brugt makroer til at se hvilke parametre der bliver sat når man importerer tekstfiler.. og så prøvet at "efterligne" makroen i delphi igennem noget automation OLE-halløj!
jeg har fundet ud af hvordan man vha automation åbner excel fra delphi og åbner workbooks og worksheets og manipulerer tal/formler/celler, men jeg vil da gerne se dit eksempel - det kan være der er et eller andet jeg kan bruge!
Hermed eksempel. Fejlcheck kan jeg ikke finde ud af, men jeg har lavet et større program som bruges internt i et firma og det fungerer fejlfrit. Du kan jo læse din .CSV fil som text fil og derefter generere excel filen. Hvis det er en større sag så pas på med hastigheden, meget generelt kan man regne med at et kald tager lige lang tid uanset hvor mange celler der er involveret.
okay takker, alt det havde jeg nu fundet ud af... mit problem er ikke at åbne en workbook/et worksheet. det er heller ikke at skrive data i en workbook!
problemet er at åbne i excel fil ind i en åben fil hvis du forstår? altså så den ikke åbnes som en ny workbook, men at dataene i filen loades ind i den allerede åbne workbook - som når man importerer data i excel!
Hej Jeg har udelukkende oprettet en ny Excel fil eller arbejdet videre på en eksisternede Excel fil som ikke er åben. Har aldrig overført data til en Excel fil som en bruger har åbnet først. //PZ
Hvis nogen er interesset har jeg fundet en metode til at hente data fra en given .csv-fil ind i en åbent excelfil.. eksemplet tager udgangspunkt i at .csv-filen er kommasepareret.. hvis man som jeg har en semikolon-separeret, skal man bruge delimitedtext property'en istedet for commatext property'en som er brugt i nedenstående eksempel!
lukker....
her er et svar fra experts-exchange.com: -----------------------------------------------------
OpenText will open a new work sheet, so it isn't really what your after. You could use the QueryTables to import the data, but it is fairly simple if you just want to work with the range object. The example (function) below loads a CSV file, calculates the rows and columns, and then imports this data into your worksheet exactly where you want it (say for example, at cell A1).
function Max(I1, I2: Integer): Integer; begin if (I1 > I2) then result:=I1 else result:=I2; end;
begin
// Create string lists to the hold the file and one to parse the lines in the file tsFile:=TStringList.Create; tsLine:=TStringList.Create; try // Attempt to load the file tsFile.LoadFromFile(FileName); // Calculate the number of rows and max columns in the file dwRows:=0; dwCols:=0; // Iterate the lines for dwCount:=0 to Pred(tsFile.Count) do begin // Check for blank lines which will not get included if (Length(Trim(tsFile[dwCount])) > 0) then begin // Increment the row count Inc(dwRows); // Clear the line parser tsLine.Clear; // Set the comma text tsLine.CommaText:=tsFile[dwCount]; // Get the max column count dwCols:=Max(dwCols, tsLine.Count); end; end; // If no rows or cols then nothing to do if (dwRows > 0) and (dwCols > 0) then begin // Create variant array to hold the range data vaRange:=VarArrayCreate([0, Pred(dwRows), 0, Pred(dwCols)], varVariant); try // Fill the array in dwRow:=0; for dwCount:=0 to Pred(tsFile.Count) do begin // Break if row count has been hit if (dwRow = dwRows) then break; // Check for blank lines which will not get included if (Length(Trim(tsFile[dwCount])) > 0) then begin // Clear the line parser tsLine.Clear; // Set the comma text tsLine.CommaText:=tsFile[dwCount]; // Set the columns for dwCol:=0 to Pred(dwCols) do begin if (dwCol >= tsLine.Count) then vaRange[dwRow, dwCol]:='' else vaRange[dwRow, dwCol]:=tsLine[dwCol]; end; // Increment the row counter Inc(dwRow); end; end; // Get the range and resize it Range:=WorkSheet.Range[StartCell].Resize[dwRows, dwCols]; // Set the variant array data to the desired range Range.Value:=vaRange; finally // Clear the variant data VarClear(vaRange); end; end; finally // Free the string lists tsLine.Free; tsFile.Free; end;
end;
procedure TForm1.Button1Click(Sender: TObject); var OleApplication: Variant; OleWorkBook: Variant; OleWorkSheet: Variant; begin
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.