Apache POI:在Word文档中查找没有空格的字符

时间:2014-07-04 09:30:40

标签: java ms-word apache-poi

我想使用Apache POI读取Word文档中没有空格的字符数。 我可以使用SummaryInformation.getCharCount()方法获取带空格的字符数,如下面的代码所示:

public void countCharacters() throws FileNotFoundException, IOException {
    File wordFile = new File(BASE_PATH, "test.doc");
    POIFSFileSystem p = new POIFSFileSystem(new FileInputStream(wordFile));
    HWPFDocument doc = new HWPFDocument(p);
    SummaryInformation props = doc.getSummaryInformation();
    int numOfCharsWithSpaces = props.getCharCount();
    System.out.println(numOfCharsWithSpaces);
}

但是似乎没有方法可以返回没有空格的字符数。 我如何找到这个值?

1 个答案:

答案 0 :(得分:2)

如果您希望以文档的元数据为基础,您将获得估计(根据Microsoft规范)。您可以使用以下两个值:

不要问我这两个值的确切差异。我没有设计这个东西......

下面是一个代码示例来说明对它们的访问( GKPIDDSI_CCHWITHSPACES 有点尴尬):

private System.Timers.Timer Timer; // Used to introduce a delay after the MediaEnded event is raised, otherwise player won't chain up the songs

private void ScheduleSongs() {
    var count = 0;
    var firstSong = atrinktas.FirstOrDefault(); // using Linq
    if(firstSong == null) return;
    axWindowsMediaPlayer1.URL = firstSong.getVardas();
    // PlayStateChange event let you listen your player's state. 
    // https://msdn.microsoft.com/fr-fr/library/windows/desktop/dd562460(v=vs.85).aspx
    axWindowsMediaPlayer1.PlayStateChange += delegate(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e) { 
       if(e.newState == 8 && count < atrinktas.Count()) {
          count++;
          var nextSong = atrinktas[count];
          axWindowsMediaPlayer1.URL = nextSong.getVardas();
          Timer = new System.Timers.Timer() { Interval = 100 };
          Timer.Elapsed += TimerElapsed; // Execute TimerElapsed once 100ms is elapsed          
       } 
    };
}

private void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    Timer.Stop();
    Timer.Elapsed -= TimerElapsed;
    Timer = null;

    axWindowsMediaPlayer1.Ctlcontrols.play(); // Play the next song
}

Word更新这些值的内部算法开始的时刻对我来说是不可预测的。因此,您在Word自己的统计信息中看到的内容可能不一定与运行上述代码时相同。