C#导入导出Office文档

为了减少对其它商业软件的依赖,对于像导入导出Office文档这样的功能,可以不使用PIA程序集,而像下面这样:
[crayon lang=”c#”]string strConn = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source='” + path.Trim() + “‘;Extended Properties=’Excel 8.0;HDR=Yes;IMEX=1′”;
OleDbConnection OleConn = new OleDbConnection(strConn);
OleConn.Open();
string strExcel = “Select * From [Sheet1$]”;
OleDbDataAdapter OleDA = new OleDbDataAdapter(strExcel, strConn);
DataTable table = new DataTable();
OleDA.Fill(table);[/crayon]
这样客户端不需要安装Office就可以读取Excel里的数据,其中连接字符串里的IMEX=1是指定混合类型的数据列均按文本来读取,据说可以解决数据列里有多个类型的数据时某些数据读取不出的问题。可惜的是,尝试后发现不起作用。

后来在某处看到一个新的解决方法:
[crayon lang=”c#”]修改HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Excel的TypeGuessRows值为0,预设是8
其原理是Office会先读取每一列的前8行来决定每一个数据列的类型,所以如果前8行的资料都是数字,到了第9行以后出现的文字资料都会变成null,设为0即表示事先决定数据列的类型。[/crayon]
问题虽然解决了,但显示这不是一个好办法,这要求每个客户端都必须修改注册表,比起Office的装机量,使用PIA来读取Office文件或许是个更明智的选择:
[crayon]excel = new Excel.Application();
excel.Application.Workbooks.Open(path, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing);
Excel.Workbook wb = excel.Workbooks[1];

Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[“Sheet1”];
DataTable table = new DataTable();
for (int i = 0; i < ws.UsedRange.Columns.Count; i++) { DataColumn dc = new DataColumn(); dc.ColumnName = ((Excel.Range)ws.Cells[1, i + 1]).Value; table.Columns.Add(dc); } DataRow dr; for (int n = 1; n < ws.UsedRange.Rows.Count; n++) { dr = table.NewRow(); for (int m = 0; m < ws.UsedRange.Columns.Count; m++) { dr[m] = ((Excel.Range)ws.Cells[n + 1, m + 1]).Value; } table.Rows.Add(dr); }[/crayon]

软件通过审核

软件名称: 运营管理系统
版         本: 3.0
开发语言: C# + WPF + SQL SERVER + .net 4.0 + NH2.1.2
运行结构: Browse Application
开发周期: 120天(coding)
总   代 码: 61000行
功        能: 商品管理
                   采购管理
                   销售管理
                   促销活动管理
                   顾客信息管理
                   现金、库存报表
                   通知管理
                   考勤打卡
                   权限管理
                   指纹验证
                   条码打印

封装了Popup

代码如下:

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using System.Windows.Threading;
 
namespace Yuzifu.Tools
{
    public sealed class MessagePopup
    {
        public static void Show(UIElement parent, string message)
        {
            parent.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =&gt;
                {
                    Popup popup = new Popup();
                    popup.StaysOpen = true;
                    popup.PlacementTarget = parent;
                    popup.Placement = PlacementMode.Center;
 
                    Border aroundBorder = new Border();
                    aroundBorder.BorderThickness = new Thickness(2);
                    aroundBorder.BorderBrush = Brushes.SteelBlue;
 
                    StackPanel aroundStackPanel = new StackPanel();
                    aroundStackPanel.MinWidth = 320;
                    aroundStackPanel.MinHeight = 120;
                    aroundStackPanel.MaxWidth = 480;
                    aroundStackPanel.Background = Brushes.White;
                    aroundStackPanel.Orientation = Orientation.Vertical;
                    aroundStackPanel.FlowDirection = FlowDirection.LeftToRight;
 
                    DockPanel headDockPanel = new DockPanel();
                    headDockPanel.VerticalAlignment = VerticalAlignment.Top;
                    headDockPanel.Background = Brushes.SteelBlue;
 
                    TextBlock headTextBlock = new TextBlock();
                    headTextBlock.Margin = new Thickness(10, 0, 0, 0);
                    headTextBlock.Text = "提示";
                    headTextBlock.Height = 26;
                    headTextBlock.HorizontalAlignment = HorizontalAlignment.Left;
                    headTextBlock.VerticalAlignment = VerticalAlignment.Center;
                    headTextBlock.FontSize = 16;
                    headTextBlock.Focusable = false;
                    headTextBlock.IsHitTestVisible = false;
                    headTextBlock.Background = Brushes.SteelBlue;
                    headTextBlock.Foreground = Brushes.White;
 
                    TextBlock messageTextBlock = new TextBlock();
                    messageTextBlock.Text = message;
                    messageTextBlock.Margin = new Thickness(20, 20, 20, 10);
                    messageTextBlock.MinHeight = 28;
                    messageTextBlock.VerticalAlignment = VerticalAlignment.Top;
                    messageTextBlock.HorizontalAlignment = HorizontalAlignment.Left;
                    messageTextBlock.TextWrapping = TextWrapping.Wrap;
 
                    Button okButton = new Button();
                    okButton.Content = "OK";
                    okButton.Margin = new Thickness(0, 0, 20, 10);
                    okButton.Padding = new Thickness(25, 3,25,3);
                    okButton.HorizontalAlignment = HorizontalAlignment.Right;
                    okButton.Click += delegate
                    {
                        popup.IsOpen = false;
                        parent.IsEnabled = true;
                    };
 
                    headDockPanel.Children.Add(headTextBlock);
                    aroundStackPanel.Children.Add(headDockPanel);
                    aroundStackPanel.Children.Add(messageTextBlock);
                    aroundStackPanel.Children.Add(okButton);
                    aroundBorder.Child = aroundStackPanel;
                    popup.Child = aroundBorder;
 
                    parent.IsEnabled = false;
                    popup.IsOpen = true;
                }));
        }
    }
}

使用方法:

MessagePopup.Show(this,”显示文字”);

显示效果如下:

WPF多线程以及UI

一、界面无响应,即所谓的卡

可以使用
delegate void DeleDisp();
DeleDisp dd = new DeleDisp(DispInfo);
dd.BeginInvoke(null, null);

如果使用了
Dispatcher.BeginInvoke(dd);
则界面依然会卡

二、报异常“控件由其它线程创建,无法访问其它线程的UI”

这个比较简单
只要使用把访问UI属性的代码用
Dispatcher.BeginInvoke()
包装起来就可以了。

如果是循环更改界面,则应该把把循环的代码放在Dispatcher.BeginInvoke()外面。

三、控件不能同步显示

如果出现这种现象,既可以调用控件的
Refresh()
方法来刷新,

还可以调用
System.Windows.Forms.Application.DoEvents()
方法来刷新。

C#库:冒泡算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public int[] SortInt(int[] R)
        {
            for (int i = R.Length - 1; i >= 0; i--)
            {
                for (int n = 0; n < i; n++)
                {
                    if (R[n] > R[n + 1])
                    {
                        int temp;
                        temp = R[n];
                        R[n] = R[n + 1];
                        R[n + 1] = temp;
                    }
                }
            }
 
            return R;
        }

C#库:汉字转拼音首字母

此源码由Internet得到,因为作者提供的方法是把汉字转拼音首字母而把其它的字符丢弃,这与我的需求不同,所以修改了其方法,为方便以后使用,特编译发布。

源码及链接库如下:
源码
链接库

作用:
1,转换字符串中的汉字为其拼音首字母
2,转换字符串中的小写字母为大写字母
3,字符串中的其它字符不变

使用方法:
1,在项目引用ChineseFirstPY.dll
2,引用ChineseFirstPY命名空间
3,使用FirstPY.Convert(string strText)方法,返回值类型为string