我想使用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);
}
但是似乎没有方法可以返回没有空格的字符数。 我如何找到这个值?
答案 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自己的统计信息中看到的内容可能不一定与运行上述代码时相同。