2017-03-21 9 views
2

データがExcelファイルとして出力され、一部のセルには、取り消し線文字として表された以前のバージョンのデータを含む文字列が含まれています。私はPerlとOLEを使ってExcelファイルを解析/操作する方法を知っていますが、セルレベルではテキスト形式でアクセス可能です。文字単位で書式設定にアクセスする方法はありますか?目標は、取り消し線としてフォーマットされたすべてのテキストを見つけて削除することです。Perl(またはPython)とExcelには、セル内の複数行のテキストで使用されるフォントの種類を判別する方法がありますか?

+0

は、Win32 :: OLEと範囲を出力します。http:/ /www.perlmonks.org/?node_id=888927 – ThisSuitIsBlackNot

答えて

1

私はマシンにPythonをインストールしていないので、これはVBAソリューションです。うまくいけば、それは個々の文字のフォーマットにアクセスする方法を示すことができます。以下では

Range("A1")です:

enter image description here

Option Explicit 

Sub test() 
    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim sentence As Range 
    Set wb = ThisWorkbook 
    Set ws = wb.ActiveSheet 
    Set sentence = ws.Range("A1") 

    With sentence 
     Dim i As Long 
     For i = 1 To .Characters.Count 
      If .Characters(i, 1).Font.Strikethrough Then 
       Debug.Print "strikethrough at character " & i 
      End If 
     Next i 
    End With 
End Sub 

は、出力を提供します:

strikethrough at character 17 
strikethrough at character 18 
strikethrough at character 19 
1

使用Spreadsheet::ParseExcel複数の形式で個々の細胞だけでなく、複雑なセルにアクセスします。複雑なセルはリッチテキストの書式設定を使用し、$cell->get_rich_text()メソッドでアクセスできます。ここでは のストライクアウト の形式を、個々のセル内と、マルチフォーマットセルの一部として、perldoc Spreadsheet::ParseExcelの形式から順に探しています。

lazy_dog.png

parse_lazy_dog.pl

#!/usr/bin/env perl 

use warnings; 
use strict; 

use Spreadsheet::ParseExcel; 

my $file = 'lazy_dog.xls'; 
my $parser = Spreadsheet::ParseExcel->new(); 
my $workbook = $parser->parse($file); 

if (!defined $workbook) { 
    die $parser->error(), ".\n"; 
} 

for my $worksheet ($workbook->worksheets()) { 

    my ($row_min, $row_max) = $worksheet->row_range(); 
    my ($col_min, $col_max) = $worksheet->col_range(); 

    for my $row ($row_min .. $row_max) { 
     for my $col ($col_min .. $col_max) { 

      my $cell = $worksheet->get_cell($row, $col); 
      next unless $cell; 

      print "Row, Col   = ($row, $col)\n"; 
      print "Value    = ", $cell->value(),  "\n"; 
      print "Unformatted Value = ", $cell->unformatted(), "\n"; 

      if (my $rich = $cell->get_rich_text()) { 
       # Multiple formats inside one cell 
       print "  STRIKEOUT -> ";     
       my $pos = 0; 
       for my $rich_elem (@$rich) { 
        my ($char_pos, $font) = @$rich_elem; 
        if ($font->{Strikeout}) { 
         while ($pos++ < $char_pos) { 
          print " "; 
         } 
        } else { 
         while ($pos++ <= $char_pos) { 
          print "^"; 
         } 
        } 
       } 
       print "\n"; 

      } else { 
       # Entire cell has same format 
       my $format = $cell->get_format(); 
       my $is_strikeout = $format->{Font}->{Strikeout}; 
       if ($is_strikeout) { 
        print "  STRIKEOUT -> "; 
        print "^"x(length($cell->unformatted())); 
        print "\n"; 
       } 
       print "\n"; 
      } 
     } 
    } 
} 

あなたは個々の文字や文字にアクセスすることができますように見えます

Row, Col   = (0, 0) 
Value    = The 
Unformatted Value = The 

Row, Col   = (0, 1) 
Value    = quick 
Unformatted Value = quick 

Row, Col   = (0, 2) 
Value    = brown 
Unformatted Value = brown 

Row, Col   = (0, 3) 
Value    = fox 
Unformatted Value = fox 

Row, Col   = (0, 4) 
Value    = jumped 
Unformatted Value = jumped 

Row, Col   = (0, 5) 
Value    = under 
Unformatted Value = under 
    STRIKEOUT -> ^^^^^ 

Row, Col   = (0, 6) 
Value    = over 
Unformatted Value = over 

Row, Col   = (0, 7) 
Value    = the 
Unformatted Value = the 

Row, Col   = (0, 8) 
Value    = lazy 
Unformatted Value = lazy 

Row, Col   = (0, 9) 
Value    = dog. 
Unformatted Value = dog. 

Row, Col   = (1, 0) 
Value    = THE QUICK BROWN FOX JUMPED UNDER OVER THE LAZY DOG. 
Unformatted Value = THE QUICK BROWN FOX JUMPED UNDER OVER THE LAZY DOG. 
    STRIKEOUT ->        ^^^^^ 
関連する問題