Latest Article

How to Import MS Word data table into Database

Detail




This tutorial shows how to Import data table in MS Word into Database, in this tutorial I will use Database MS SQL, you can use another database product, because here I use standard SQL format.
1.       Prepare Ms Word file with data table in it, for example my MS Word as follow

2.       Open Delphi
3.       Create new Application
4.       Setup the form as follow

Component
Property
Value
TButton
Name
Button1
Caption
Open MsWord File and Inser into Database
TOpenDialog
Name
Opendialog1
TAdoquery
Name
Q1

Connection String
<assign to your database connection string>


5.       Prepare array data type to storing data table from Ms Word file


6.       Create  some functions for the process

As you see on the image there are 4 functions will be created in this tutorial.
Lets me explain the functionality of each function
1.       getSqlCreatetable
It will return SQL script to create a table
2.       getSqlInserttable
It will return SQL script to insert data into a table
3.       executeSQL
It will execute SQL script that returned by function number 1 and number 2
4.       getMSWordTable
it will return arrays that contain data tables in MsWord file
                The content of each function as follow
function TForm1.executeSQL (inSQL : string) : boolean;
begin
  result := true;

  Q1.close;
  Q1.SQL.Clear;
  Q1.SQL.Text := inSQL;
  try
    Q1.ExecSQL;
  except
    result := false;
  end;
end;

               
function TForm1.getSqlCreatetable(inTableName : string;inContent : array of string) : string;
 var sql : string;
       i : integer;
begin
    sql := 'create table '+ ExtractFileName(inTableName) + '(';
    for i:=0 to length(inContent)-1 do
      if i < length(inContent)-1 then
        sql := sql + 'COL'+ inttostr(i)+' varchar(255),'
      else
        sql := sql + 'COL'+ inttostr(i)+' varchar(255))';
    result := sql;
end;

function TForm1.getSqlInserttable(inTableName : string;inContent : array of string) : string;
  var sql : string;
        i : integer;
begin
    sql := 'insert into '+ ExtractFileName(inTableName) + ' values (';
    for i:=0 to length(inContent)-1 do
      if i < length(inContent)-1 then
        sql := sql + QuotedStr(inContent[i]) +','
      else
        sql := sql + QuotedStr(inContent[i]) +')';
    result := sql;
end;

function TForm1.getMSWordTable(inFileName : string) : TTables;
var
  MSWord, Table: OLEVariant;
  iRows, iCols, i, x, y, iNumTables : Integer;
  CellData: widestring;
  resultTables : TTables;
begin
  SetLength(resultTables,0);
  result := resultTables;

  try
    MSWord := CreateOleObject('Word.Application');
  except
    Exit;
  end;

  try
    MSWord.Visible := False;
    // Open file
    MSWord.Documents.Open(inFileName);

    // Get number of tables
    iNumTables := MSWord.ActiveDocument.Tables.Count;
    SetLength(resultTables,iNumTables);

    for i:=1 to iNumTables do
    begin
      // Read table
      Table := MSWord.ActiveDocument.Tables.Item(i);
      // get Row Number and Col Number
      iCols := Table.Rows.Count;
      iRows := Table.Columns.Count;
      // Set Table Name
      resultTables[i-1].name := MidStr(ExtractFileName(inFileName),1, length(ExtractFileName(inFileName)) - length(ExtractFileExt(inFileName))) + inttostr(i) + formatdatetime('yyyymmddhhnnss',now);
      // Initialize Array
      setLength(resultTables[i-1].data,iRows);
      for x:=0 to length(resultTables[i-1].data)-1 do
        setLength(resultTables[i-1].data[x],iCols);

     // loop through cells
      for x := 1 to iRows do
       for y := 1 to iCols do
       begin
        CellData := Table.Cell(y, x).Range.FormattedText;
        if not VarisEmpty(CellData) then
        begin
          // Remove Tabs
          CellData := StringReplace(CellData,#$D, '', [rfReplaceAll]);
          // Remove linebreaks
          CellData := StringReplace(CellData,#$7, '', [rfReplaceAll]);

          // Load Cell data
          resultTables[i-1].data[y-1][x-1] := CellData;
        end;
      end;
    end;
  finally
    MSWord.Quit;
  end;

  result := resultTables;
end;

7.       Create On Click event  for Button1, with script as follow

procedure TForm1.Button2Click(Sender: TObject);
var data : TTables;
    numTable : integer;
    iTable,iRow, iCol  :  integer;
    content : array of string;
    fileName : string;
begin
  if OpenDialog1.Execute then
  begin
     fileName := OpenDialog1.FileName;
      // check availability of file
     if not FileExists(fileName) then
     begin
       MessageDlg('Invalid file', mtError,[mbOk],0 );
       exit;
     end;

      // check file extensions
     if ExtractFileExt(fileName) <> '.doc' then
     begin
       MessageDlg('Invalid format', mtError,[mbOk],0 );
       exit;
     end;

     data := getMSWordTable(fileName);
  end else
   exit;

  // get Number of tables
  numTable :=  length(data);

  for iTable:= 0 to numTable-1 do
  begin
   for iRow := 0 to length(data[iTable].data)-1 do
   begin
     SetLength(content, length(data[iTable].data[iRow]));
     for iCol := 0 to length(data[iTable].data[iRow])-1 do
         content[iCol] := data[iTable].data[iRow][iCol] ;

     if iRow = 0 then
     begin
        // create table with 1st row as header
       if not executeSQL(getSqlCreatetable(data[iTable].name, content)) then
          break;
     end else
     begin
       // insert the datas
       if not executeSQL(getSqlInserttable(data[iTable].name, content)) then
         break;
     end;
   end;
  end;
  MessageDlg('Finished',mtInformation,[mbOk],0);
end;



8.       Now it’s ready for test, run the application by pressing F9 then open the MsWord file that you have prepared
Wait until finished dialog information appear


9.       Check the result into Database

Finish. You can download the source code from download menu.

How To Compare 2 Images

Detail


Here i show a function to compare 2 images. If the images are different then the result will be True, the function as follow:


function checkIsDiffrentImage(img1, img2: TBitmap): boolean;
var
  p1, p2  : PByte;
  x, y, i : integer;
  checkRes: boolean;
begin
  if not(img1.PixelFormat = img2.PixelFormat) then
  begin
    result := true;
    exit;
  end;
  checkRes := false;

  y:=0;
  while not(checkRes) and (y < img1.Height) do
  begin
    p1 := img1.Scanline[y];
    p2 := img2.Scanline[y];
    x := 0;
    while not(checkRes) and (x < img1.Width) do
    begin
      if Integer(p1^) <> Integer(p2^) then
         checkRes := true
      else begin
        Inc(p1);
        Inc(p2);
      end;
     inc(x);
    end;
    inc(y);
  end;
  result := checkRes;
end;



Below is a sample code, how to use the function.
1.       Prepare 2 Bitmap Image



2.       Put Timage component into Form, then load the images

3.       Put Tbutton component into Form then set OnClick Event
procedure TForm1.Button1Click(Sender: TObject);
begin
 if checkIsDiffrentImage(Image1.Picture.Bitmap,image2.Picture.Bitmap) then
   showMessage('The images are not same')
 else
   showMessage('The images are same');
end;

let's test the function by running the application 



 
Delphi Programming Tutorial © Mang Yadi Site 2015