在工作中,遇到這麼個問題,需要將 Excel 表中類似 2134-1234-4456 的商品編號輸入到單位的程序中,而程序只認 213412344456 這種沒有 ‘-’ 的輸入。數量比較多,一筆一筆的敲,費時費力不可取,所以轉換一下,復制粘貼,不僅可以提高速度,而且也不易出錯。並且,由於 Excel 表是別人提供,可能反復遇到此問題,所以寫個轉換的小工具是必要的。
直接操作 Excel 嗎?問題 ”矮小下“,顯然用不著這麼麻煩。我的方法是,將商品編號列復制粘貼到記事本中保存為 temp.txt 文件。現在問題一下子就簡化為普通的文本處理了。新建一個 WPF 程序,其 MainWindow.xaml 和 MainWindow.xaml.cs 內容如下:
<?xml version="1.0" encoding="utf-8"?> <Window x:Class="TextProc.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Text Proc" Height="380" Width="500" WindowStartupLocation="CenterScreen"> <StackPanel> <ScrollViewer Height="300" VerticalScrollBarVisibility="Auto"> <TextBox Name="txtContent" Margin="5" /> </ScrollViewer> <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> <Button Name="btnSelect" Content="_Select" /> <Button Name="btnProcess" Content="_Process" /> </StackPanel> </StackPanel> </Window> MainWindow.xaml /** * MainWindow.xaml.cs (c) 2015 by x01 * ---------------------------------- */ using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using Microsoft.Win32; namespace TextProc { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class MainWindow : Window { string _path = null; OpenFileDialog _dlg = new OpenFileDialog(); public MainWindow() { InitializeComponent(); _dlg.Filter = "*.txt|*.txt|*.*|*.*"; btnProcess.Click += delegate { if (string.IsNullOrEmpty(_path)) return; var text = File.ReadAllText(_path); text = ProcessText(text); txtContent.Text = text; File.WriteAllText(_path + ".proc", text); MessageBox.Show("Process Text Success!"); }; btnSelect.Click += delegate { _dlg.ShowDialog(); _path = _dlg.FileName; txtContent.Text = File.ReadAllText(_path); }; } // 主要的文本處理邏輯,換行作分割,只保留數字,可根據實際情況調整。 private string ProcessText(string text) { string [] arr = text.Split('\n'); List<string> result = new List<string>(); foreach (var a in arr) { char[] cs = a.ToCharArray(); string s = string.Empty; for (int i = 0; i < cs.Length; i++) { if (cs[i] < '0' || cs[i] > '9') continue; s += cs[i].ToString(); } result.Add(s); } string str = string.Empty; foreach (var r in result) { str += r + "\n"; } return str; } } } MainWindow.cs由於是在 XP 系統用 SharpDev 編寫,所以 xaml 文件稍有不同。
處理後,再復制回 Excel 表中。花個兩三分鐘就解決了問題,還是不錯的。
在 windows10 和 vs2015 這兩個巨無霸來臨之際,作為編程愛好者,不要忘了,編程是為了解決問題這一本質,是為記。
我也是醉了,Ctl + H 即可解決,竟然寫了個程序!之所以如此,是因為我幾乎從來不用 Ctl+H 來全部替換:一不小心改了不該改的數據,在單位可不是小問題。
解決問題的方法從來都不是一種,還是予以保留吧,因為我的出發點是解決 Excel 問題,並不一定要操作 Excel。