IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Insertion de données Csv dans un tableaux RTF RichEdit


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 369
    Par défaut Insertion de données Csv dans un tableaux RTF RichEdit
    Bonjour à tous,

    Voici mon code qui me permet de récupéré des données d'un fichier Csv puis de créer un tableaux type RTF dans un TRichEdit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     private
        { Private declarations }
        { GetColCsv }
        function GetColCsv(const Str: String): Integer;
        { TabCsvToRTF }
        procedure TabCsvToRTF(RichEdit: TRichEdit);
        { LoadCSVtoRTF }
        procedure LoadCSVtoRTF(FileName: String; RichEdit: TRichEdit);
     
      end;
     
    var
      FOpenCsv: TFOpenCsv;
      TabCsv: array of array of String;
     
    const
      QuoteChar = '"';
      Delimiter = ';';
     
    implementation
     
    {$R *.dfm}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     { GetColCsv }
    function TFOpenCsv.GetColCsv(const Str: String): Integer;
    var
      InWord, InQuote: Boolean;
      I, ICount: Integer;
    begin
      if Str = EmptyStr then
        Exit;
     
      Result := 1;
      InWord := False;
      InQuote := False;
     
      for I := 1 to Length(Str) do
      begin
        if Str[I] = QuoteChar then
          InQuote := not InQuote;
     
        if Str[I] = Delimiter then
        begin
          if not InQuote then
            Inc(Result);
        end;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     { TabCsvToRTF }
    procedure TFOpenCsv.TabCsvToRTF(RichEdit: TRichEdit);
    var
      I, J: Integer;
      TabStr: String;
    begin
      TabStr := '{\rtf1\trowd';
     
      for J := Low(TabCsv[1]) to High(TabCsv[1]) do
      begin
        TabStr := TabStr + '\intbl ';
     
        for I := Low(TabCsv) to High(TabCsv) do
          TabStr := TabStr + TabCsv[I, J] + '\cell ';
     
        TabStr := TabStr + '\row';
      end;
     
      TabCsv := nil;
     
      with RichEdit do
      begin
        Lines.BeginUpdate;
        SelText := TabStr + '}';
        Lines.EndUpdate;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     { LoadCSVtoRTF }
    procedure TFOpenCsv.LoadCSVtoRTF(FileName: String; RichEdit: TRichEdit);
    var
      StrFile: TStringList;
      Row, Col, ColCount, IDelimiter: Integer;
      StrLine: String;
    begin
      StrFile := TStringList.Create;
     
      try
        StrFile.LoadFromFile(FileName);
     
        if StrFile.Count = 0 then
        begin
          FreeAndNil(StrFile);
          ShowMessage('Le fichier csv ne contient aucune donnée !');
          Exit;
        end;
     
        ColCount := GetColCsv(StrFile[0]);
     
        if ColCount <= 1 then
        begin
          FreeAndNil(StrFile);
          ShowMessage('Le format du fichier csv n''est pas correct !');
          Exit;
        end;
     
        SetLength(TabCsv, ColCount, StrFile.Count);
     
        for Row := 0 to StrFile.Count - 1 do
        begin
          StrLine := StrFile[Row];
          Col := 0;
     
          while StrLine <> EmptyStr do
          begin
            if Pos(QuoteChar, StrLine) = 1 then
            begin
              Delete(StrLine, 1, 1);
              TabCsv[Col, Row] := Copy(StrLine, 1, Pos(QuoteChar, StrLine) - 1);
              Delete(StrLine, 1, Pos(QuoteChar, StrLine));
              Delete(StrLine, 1, Pos(Delimiter, StrLine));
            end
            else
            begin
              IDelimiter := Pos(Delimiter, StrLine);
     
              if IDelimiter = 0 then
                Inc(IDelimiter, Length(StrLine) + 1);
     
              TabCsv[Col, Row] := Copy(StrLine, 1, IDelimiter - 1);
              Delete(StrLine, 1, IDelimiter);
            end;
     
            Inc(Col);
          end;
        end;
      except
        ShowMessage('Le format du fichier csv n''est pas correct !');
      end;
     
      FreeAndNil(StrFile);
      TabCsvToRTF(RichEdit);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     { OpneCsv Click }
    procedure TFOpenCsv.OpneCsvClick(Sender: TObject);
    begin
      if OpenDialog.Execute() then
      begin
        TabCsv := nil;
        LoadCSVtoRTF(OpenDialog.FileName, RichEdit);
      end;
    end;
    Tout fonctionne impeccable sous Windows 10 par contre sur Windows 7 impossible de créer le tableaux avec les données.

    Résultat sous Windows 10 :

    Nom : Capture1.PNG
Affichages : 130
Taille : 97,0 Ko

    Résultat sous Windows 7 :

    Nom : Capture2.PNG
Affichages : 115
Taille : 41,2 Ko

    Par contre créer un tableau sans données cela fonctionne bien sous Win 7 & 10.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    { CmToTwip }
    function CmToTwip(Cm: Integer): Integer;
    const
      Twip1Cm = 566.92;
    begin
      Result := Round(Twip1Cm * Cm);
    end;
     
    { MmToTwip }
    function MmToTwip(Mm: Integer): Integer;
    const
      Twip1Mm = 56.69;
    begin
      Result := Round(Twip1Mm * Mm);
    end;
     
    { TabRTF }
    function TFTabStr.TabRTF(TabCol, TabLn, TabSizeCol, TabSizeLn: Integer): String;
    var
      I, J: Integer;
    begin
      Result := '{\rtf1\trowd';
     
      for I := 1 to TabCol do
        Result := Result + Format('\cellx%d',
          [I * (CmToTwip(TabSizeCol))]);
     
      for J := 1 to TabLn do
      begin
        Result := Result + '\trrh' + IntToStr(MmToTwip(TabSizeLn)) + '\intbl';
     
        for I := 1 to TabCol do
          Result := Result + '\cell';
     
        Result := Result + '\row';
      end;
     
      Result := Result + '}';
    end;
     
    // 10 Col, 100 Ln, 5 cm, 10mm
    // RichEdit.SelText := TabRTF(10, 100, 5, 10);
    Je n'arrive pas à capté d'où vient de problème.
    Un problème de syntaxe RTF ? ! Cela ne fonctionnerait pas sous Windows 10

    Csv.zip
    Merci.

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    je t'invite à comparer les fichiers raw.rtf et richedit.rtf obtenus avec ces deux lignes en plus dans ton code (avec l'unit System.IOUtils pour TFile.WriteAllText)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      with RichEdit do
      begin
        Lines.BeginUpdate;
        SelText := TabStr + '}';
        Lines.EndUpdate;
        TFile.WriteAllText('raw.rtf', TabStr + '}'); // ton code RTF
        Lines.SaveToFile('RichEdit.rtf'); // celui de RichEdit
      end;
    ensuite tente de lire l'un et l'autre sous W7
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éprouvé
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 369
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    je t'invite à comparer les fichiers raw.rtf et richedit.rtf obtenus avec ces deux lignes en plus dans ton code (avec l'unit System.IOUtils pour TFile.WriteAllText)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      with RichEdit do
      begin
        Lines.BeginUpdate;
        SelText := TabStr + '}';
        Lines.EndUpdate;
        TFile.WriteAllText('raw.rtf', TabStr + '}'); // ton code RTF
        Lines.SaveToFile('RichEdit.rtf'); // celui de RichEdit
      end;
    ensuite tente de lire l'un et l'autre sous W7
    Bonjour Paul TOTH,

    Teste sous Windows 7
    - Le fichier RichEdit.rtf aucun problème de lecture, j'ai bien mon tableau & les données.
    - Le fichier raw.rtf pas de tableau

    Teste sous Windows 10
    - Le fichier RichEdit.rtf aucun problème de lecture, j'ai bien mon tableau & les données.
    - Le fichier raw.rtf aucun problème de lecteur, j'ai bien mon tableau & les données.

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    on peut donc en déduire que Microsoft a modifié son composant RICHEDIT pour que sous Windows 10 il soit capable de lire un RTF partiel, alors que Windows 7 échoue sur ce même fichier.

    c'est un peu comme le HTML en fait, si tu colles Bonjour <b>c'est l'été</b> dans un fichier HTM, tu peux t'attendre à voir le texte "Bonjour c'est l'été".

    mais il est aussi possible qu'un navigateur qui ne détecte pas les balises <!DOCTYPE HTML> ou simplement <html><body>..., l'affiche comme un texte brut, voir sous la forme Bonjour c'est l'?t? vu qu'il n'y a aucune information de page de code.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre éprouvé
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 369
    Par défaut
    Effectivement dans la procédure je ne n'avais pas défini \cellx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    { TabCsvToRTF }
    procedure TFOpenCsv.TabCsvToRTF(RichEdit: TRichEdit);
    var
      I, J, Cellx: Integer;
      TabStr: String;
    begin
      TabStr := '{\rtf1\trowd';
     
      Cellx := 1;
      for I := Low(TabCsv) to High(TabCsv) do
      begin
        TabStr := TabStr + format('\cellx%d', [Cellx * (3000)]);
        Inc(Cellx);
      end;
     
      for J := Low(TabCsv[1]) to High(TabCsv[1]) do
      begin
        TabStr := TabStr + '\intbl ';
     
        for I := Low(TabCsv) to High(TabCsv) do
          TabStr := TabStr + TabCsv[I, J] + '\cell ';
     
        TabStr := TabStr + '\row';
      end;
     
      TabCsv := nil;
     
      with RichEdit do
      begin
        Lines.BeginUpdate;
        SelText := TabStr + '}';
        Lines.EndUpdate;
      end;
    end;
    Comme ceci ça fonctionne.

    Donc Windows 10 défini automatiquement la balise \cellxN si il n'est pas indiqué dans le fichier RTF, que Windows 7 à besoin de la balise \cellxN.

    https://www.biblioscape.com/rtf15_spec.htm#Heading40

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insertion données csv dans une bdd
    Par fr0stFR dans le forum Développement de jobs
    Réponses: 6
    Dernier message: 20/06/2018, 09h14
  2. [MySQL] insertion de données csv dans une base de données
    Par angelina88 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 12/12/2011, 00h57
  3. [MySQL] enregistrer des données CSV dans une BDD
    Par NicoO_O dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 28/11/2006, 23h10
  4. [Cookies] insertion de données automatique dans formulaire
    Par chouchouboy dans le forum Langage
    Réponses: 8
    Dernier message: 09/06/2006, 11h50
  5. Réponses: 7
    Dernier message: 27/01/2006, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo