namespace PROCESS_FOLDER_V2
{
public partial class OrganiZe : Form
{
public OrganiZe()
{
InitializeComponent();
}
int TotalCnt = 0;
private void Insert(int Col1, string Col2, string Col3, string Col4, int Col5)
{
// MessageBox.Show("SNo: " + Col1 + "\n"+"\n" + "Material Code " + Col2 + "\n"+"\n" + "Item Text :" + Col3 +"\n"+"\n"+ "PO Text :" + Col4 + "\n"+"\n"+"PR Number :" + Col5, "OrganiZe");
while (Col4.Contains("'"))
{
Col4 = Col4.Replace("'", "`");
};
while (Col3.Contains("'"))
{
Col3 = Col3.Replace("'", "`");
};
//File.WriteAllText("Char.txt", Col4);
//MessageBox.Show("SNo: " + Col1 + "\n" + "\n" + "Material Code " + Col2 + "\n" + "\n" + "Item Text :" + Col3 + "\n" + "\n" + "PO Text :" + Col4 + "\n" + "\n" + "PR Number :" + Col5, "OrganiZe");
System.Data.OleDb.OleDbConnection MyConnection;
System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand();
string sql = null;
MyConnection = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0");
MyConnection.Open();
myCommand.Connection = MyConnection;
sql = "INSERT INTO [PR$]"
+ "([SNo],[MATERIAL CODE],[ITEM TEXT],[PO TEXT],[PRNo])"
+ "VALUES('" + Col1 + "','" + Col2 + "','" + Col3 + "','" + Col4 + "','" + Col5 + "')";
myCommand.CommandText = sql;
myCommand.ExecuteNonQuery();
DataSet ds = new DataSet();
OleDbDataAdapter da;
da = new OleDbDataAdapter(myCommand);
DataTable dt = new DataTable();
da.Update(dt);
// da.Fill(ds);
//dgPR.DataSource = ds.Tables[0];
MyConnection.Close();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// READ TEXT FILE
string PRtext = "";
string PRtextEdited = "";
//***************************************************************
private void ReadPDF(string getName)
{
string strText = null;
PdfReader reader = new PdfReader(getName);
for (int page = 1; page <= reader.NumberOfPages; page++)
{
ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
string s = PdfTextExtractor.GetTextFromPage(reader, page, its);
s = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(s)));
strText = strText + s;
// txtFilee.Text = strText;
}
PRtext = strText;
reader.Close();
//StreamWriter sw = new StreamWriter("PDFtoTEXT.txt");
File.WriteAllText("PDFtoText.txt", PRtext);
//sw.Close();
string lRead;
lRead = strText;
txtFilee.Text = strText;
int IndPrvPage = 0;
int len = 113;
//string Page = "";
if (lRead.Contains("'")) { lRead = lRead.Replace("'", "`"); };
int IndPage = lRead.IndexOf("Page", IndPrvPage);
while (lRead.Contains("Page") == true)
{
if (lRead.Length < (lRead.IndexOf("Page", 0) + len)) { break; }
IndPage = lRead.IndexOf("Page", IndPrvPage);
//Page = lRead.Substring(IndPage, len);
//string temp;
if (IndPage > 0) { lRead = lRead.Remove(IndPage, len); };
if (IndPage < 0) { break; };
IndPrvPage = IndPage;
//MessageBox.Show(Page);
}
//MessageBox.Show(lRead);
File.WriteAllText("PDFtoTEXT.txt", lRead);
PRtextEdited = lRead;
//MessageBox.Show(PRtextEdited);
}
//*******************************************************
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FINDING AND ORGANIZING
private void btnOrganize_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.ShowDialog();
string NameFolder = fbd.SelectedPath;
foreach (string getName in Directory.GetFiles(@NameFolder, "*.pdf"))
{
ReadPDF(getName);
int IndInitial = 0;
int index = 0;
string tmp = "";
//*****************
tmp = PRtextEdited;
//***********************
///find PR No.
int PRNo = 0;
int IndPRNo = 0;
string PRNum;
IndPRNo = tmp.IndexOf("Purchase Requisition") + 23;
PRNum = tmp.Substring(IndPRNo, 9);
// MessageBox.Show("Purchase Requisition No: " + PRNum, "OrganiZe");
int Finish = 0;
// string Zeros="000";
string Zeros3 = "000";
string Zeros2 = "00";
string Zeros1 = "0";
int N = 10;
string ItemNo = "00000";
string NxtItemNo = "00000";
int Cnt = 0;
string z = "MATERIAL DESCRIPTION & ITEM TEXT";
int IndZ = 0;
if ((tmp.IndexOf(z) < 0)) { z = "N & ITEM TEXT"; }
IndZ = tmp.IndexOf(z, IndInitial) + 25; // set starting index as MATERIAL DESCRIPTION & ITEM TEXT
//MessageBox.Show(tmp);
do
{
string txtFindPO = "Material PO Text";
string txtFindITEM = "Item Text";
string txtLast = "Prepared By";
string matCode = "";
int indMat = 0;
int indPO = 0, indItem = 0, indNext = 0;
if (N < 100) { ItemNo = Zeros3 + N.ToString(); }
if (N >= 100 && N < 1000) { ItemNo = Zeros2 + N.ToString(); }
if (N >= 1000 && N < 10000) { ItemNo = Zeros1 + N.ToString(); }
//find first item
string Item = ItemNo + " " + "M";
while (tmp.IndexOf(Item, IndZ) == -1)
{
N = N + 10;
if (N < 100) { ItemNo = Zeros3 + N.ToString(); }
if (N >= 100 && N < 1000) { ItemNo = Zeros2 + N.ToString(); }
if (N >= 1000 && N < 10000) { ItemNo = Zeros1 + N.ToString(); }
Item = ItemNo + " " + "M";
}
if (N < 90) { NxtItemNo = Zeros3 + (N + 10).ToString(); }
if (N >= 90 && N < 990) { NxtItemNo = Zeros2 + (N + 10).ToString(); }
if (N >= 990 && N < 9990) { NxtItemNo = Zeros1 + (N + 10).ToString(); }
index = tmp.IndexOf(Item, IndZ);
indMat = index;
indPO = tmp.IndexOf(txtFindPO, index);
if (indPO >= 0) { indPO = indPO + 43; };
indItem = tmp.IndexOf(txtFindITEM, index);
if (indItem >= 0) { indItem = indItem + 9; };
//find next item
string NxtItem = NxtItemNo + " " + "M";
while (tmp.IndexOf(NxtItem, IndZ) == -1)
{
N = N + 10;
if (N < 90) { NxtItemNo = Zeros3 + (N + 10).ToString(); }
if (N >= 90 && N < 990) { NxtItemNo = Zeros2 + (N + 10).ToString(); }
if (N >= 990 && N < 9990) { NxtItemNo = Zeros1 + (N + 10).ToString(); }
NxtItem = NxtItemNo + " " + "M";
indNext = tmp.IndexOf(NxtItem, index);
if (N >= 990)
{
int IndLast = 0;
IndLast = tmp.IndexOf("Prepared By", 0);
IndLast = tmp.IndexOf(txtLast, index);
indNext = IndLast;
Finish++;
break;
};
}
if (Finish < 1)
{
if (N < 90) { NxtItemNo = Zeros3 + (N + 10).ToString(); }
if (N >= 90 && N < 990) { NxtItemNo = Zeros2 + (N + 10).ToString(); }
if (N >= 990 && N < 9990) { NxtItemNo = Zeros1 + (N + 10).ToString(); }
NxtItem = NxtItemNo + " " + "M";
indNext = tmp.IndexOf(NxtItem, index);
}
//**********************
int lenITEM = 0;
int lenPO = 0;
string POtxt = "";
string ITEMtxt = "";
if (indPO > 0 && indItem > 0) { lenPO = (indItem - indPO) - 9; };
if (indPO > 0 && indItem < 0) { lenPO = indNext - indPO - 9; };
if (indItem > 0 && indNext > 0) { lenITEM = (indNext - indItem); }
if (lenPO > 255) { lenPO = 255; }
if (lenPO < 0) { lenPO = 0; }
matCode = tmp.Substring(indMat + 6, 11); //material code
if (indPO > 0) { POtxt = tmp.Substring(indPO, lenPO); }; //MessageBox.Show(POtxt);
if (lenITEM > 255) { lenITEM = 255; }
if (lenITEM < 0) { lenITEM = 0; }
if (indItem > 0) { ITEMtxt = tmp.Substring(indItem, lenITEM); }; //MessageBox.Show(ITEMtxt);
Cnt = Cnt + 1;
PRNo = Convert.ToInt32(PRNum);
Insert(Cnt, matCode, ITEMtxt, POtxt, PRNo); // INSERT INTO TABLE
if (Finish == 1) break;
N = N + 10;
} while (N <= 990);
//sr.Close();
TotalCnt++;
// MessageBox.Show("All Organized", "OrganiZe");
// MessageBox.Show("Total Items Nos: " + Cnt.ToString(), "OrganiZe");
}
MessageBox.Show("All completed. " + "\n" + "\n" + "No of PR processed: " + TotalCnt.ToString(), "OrganiZe");
}
private void btnShow_Click(object sender, EventArgs e)
{
string connetionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0";
string sql = "SELECT * FROM [PR$]";
OleDbConnection connection = new OleDbConnection(connetionString);
connection.ConnectionString = connetionString;
adap = new OleDbDataAdapter(sql, connection);
DataSet ds = new DataSet();
connection.Open();
adap.Fill(ds);
dgPR.DataSource = ds.Tables[0];
connection.Close();
}
private void txtFilter_TextChanged(object sender, EventArgs e)
{
conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0";
conn.Open();
OleDbCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
//cmd.CommandText = "SELECT * FROM [PR$] WHERE [MATERIAL CODE] LIKE ('" + txtFilter.Text + "%')";
/* if (cbFilter.SelectedItem.ToString() == "ITEM TEXT")
{
cmd.CommandText = "SELECT * FROM [PR$] WHERE [ITEM TEXT] LIKE ('%" + txtFilter.Text + "%')";
}
if (cbFilter.SelectedItem.ToString() == "PO TEXT")
{
cmd.CommandText = "SELECT * FROM [PR$] WHERE [PO TEXT] LIKE ('%" + txtFilter.Text + "%')";
}
if (cbFilter.SelectedItem.ToString() == "MATERIAL CODE")
{
cmd.CommandText = "SELECT * FROM [PR$] WHERE [MATERIAL CODE] LIKE ('%" + txtFilter.Text + "%')";
}
if (cbFilter.SelectedItem.ToString() == "PRNo")
{
cmd.CommandText = "SELECT * FROM [PR$] WHERE [PRNo] LIKE ('%" + txtFilter.Text + "%')";
}
*/
cmd.CommandText = "SELECT * FROM [PR$] WHERE [ITEM TEXT] LIKE ('%" + txtFilter.Text + "%')";
cmd.ExecuteNonQuery();
//OleDbDataAdapter adap = new OleDbDataAdapter("SELECT * FROM [PR$] LIKE '"+txtFilter.Text+"%'", conn);
DataTable dt = new DataTable();
adap = new OleDbDataAdapter(cmd);
adap.Fill(dt);
dgPR.DataSource = dt;
//MessageBox.Show(dt.Rows[0][0].ToString());
}
//OleDbDataAdapter adap = new OleDbDataAdapter();
// DataSet ds = new DataSet(@"PRTEXT.XLS");
// string sql;
//DataTable dt = new DataTable();
// OleDbConnection conn = new OleDbConnection();
// private string contents;
// OleDbCommandBuilder builder;
// }
private void btnUpdate_Click(object sender, EventArgs e)
{
conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0";
conn.Open();
string xlsSheet = "PR$";
string name = ds.Tables[0].Rows[0][0].ToString();
DataTable dt = (DataTable)dgPR.DataSource;
string changeColumns = "";
for (int i = 0; i < Table.ColumnName.Count; i++)
{
changeColumns += Table.ColumnName[i] + "=@" + Table.ColumnName[i];
if (Table.ColumnName.Count - 1 != i)
changeColumns += ",";
}
adap.UpdateCommand = new OleDbCommand("UPDATE [" + xlsSheet + "] SET " + changeColumns +
" WHERE " + Table.ColumnName[PrimaryColumnIndex] + " = @" + Table.ColumnName[PrimaryColumnIndex], conn);
for (int i = 0; i < Table.ColumnName.Count; i++)
{
adap.UpdateCommand.Parameters.Add("@" + Table.ColumnName[i], OleDbType.Char, 255).SourceColumn = Table.ColumnName[i];
}
foreach (int row in ListOfValues.Keys)
{
Table tbl = ListOfValues[row];
ds.Tables[0].Rows[row][Table.ColumnName[PrimaryColumnIndex]] = ds.Tables[0].Rows[row][PrimaryColumnIndex];
for (int i = 0; i < tbl.Value.Count; i++)
{
ds.Tables[0].Rows[row][Table.ColumnName[tbl.col[i]]] = tbl.Value[i];
}
//adap.UpdateCommand.ExecuteNonQuery();
adap.Update(ds.Tables[0]);
}
conn.Close();
MessageBox.Show("Updated");
}
bool isFormLoad = false;
int PrimaryColumnIndex = 4;
OleDbDataAdapter adap;
DataSet ds;
OleDbConnection conn;
OleDbCommandBuilder builder;
Dictionary<int, Table> ListOfValues = new Dictionary<int, Table>();
public class Table
{
public List<string> Value { get; set; }
public List<int> col { get; set; }
public static List<string> ColumnName;
}
private void OrganiZe_Load_1(object sender, EventArgs e)
{
conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0";
conn.Open();
adap = new OleDbDataAdapter("SELECT * FROM [PR$]", conn);
ds = new DataSet();
adap.Fill(ds, "PR");
Table.ColumnName = new List<string>();
foreach (DataColumn str in ds.Tables[0].Columns)
{
Table.ColumnName.Add(str.ColumnName);
}
dgPR.DataSource = ds.Tables[0];
conn.Close();
dgPR.Columns[PrimaryColumnIndex].ReadOnly = true;
dgPR.RowValidated += new DataGridViewCellEventHandler(dgPR_RowValidated);
isFormLoad = true;
}
private void dgPR_RowValidated(object sender, DataGridViewCellEventArgs e)
{
if (isFormLoad)
{
Table tbl = new Table();
DataGridView dgv = (DataGridView)sender;
tbl.Value = new List<string>();
tbl.col = new List<int>();
for (int i = 1; i < dgv.ColumnCount; i++)
{
tbl.Value.Add(dgv.Rows[e.RowIndex].Cells[i].Value.ToString());
tbl.col.Add(i);
}
if (ListOfValues.Keys.Contains(e.RowIndex))
{
ListOfValues[e.RowIndex] = tbl;
}
else
ListOfValues.Add(e.RowIndex, tbl);
}
}
}
}
Code fucntion insert works well in excel. But code Update is not working.also I tried to run step by step..it executes all but stops at adap.update(ds.tables[0]) saying Syntax error in UPDATE statement.
exception: System.Data.OleDb.OleDbException was unhandled
HResult=-2147217900
Message=Syntax error in UPDATE statement.
Source=Microsoft Office Access Database Engine
ErrorCode=-2147217900
Suppose You have following Data in your workSheet PR
FirstName LastName Age
johny Depp 55
Statham John 45
Diana bantley 35
then you have to go through this code in your Button Click for Update
conn= new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0";
conn.Open();
string xlsSheet = "PR$";
adap.UpdateCommand = new OleDbCommand("UPDATE [" + xlsSheet + "] SET FirstName = ?, LastName = ?, Age = ?" +
" WHERE FirstName = "+ ds.Tables[0].Rows[0][0], conn);
adap.UpdateCommand.Parameters.Add("@FirstName", OleDbType.Char, 255).SourceColumn = "FirstName";
adap.UpdateCommand.Parameters.Add("@LastName", OleDbType.Char, 255).SourceColumn = "LastName";
adap.UpdateCommand.Parameters.Add("@Age", OleDbType.Char, 255).SourceColumn = "Age";
//// Updates the first row
ds.Tables[0].Rows[0]["FirstName"] = "john";
ds.Tables[0].Rows[0]["LastName"] = "Statham";
ds.Tables[0].Rows[0]["Age"] = "55";
adap.Update(ds.Tables[0]);
conn.Close();
MessageBox.Show("Updated");
where we give whole Query of update and in where condition we pass value of first index (ie (Zero index) value) , this update value Succesfully by changing our data DataTable Zero Index row.
Here is a full work of your given conditions, kindly check from your end.
private void btnUpdate_Click(object sender, EventArgs e)
{
conn.Open();
string xlsSheet = "PR$";
string name = ds.Tables[0].Rows[0][0].ToString();
DataTable dt = (DataTable)dgPR.DataSource;
string changeColumns = "";
for (int i = 0; i < Table.ColumnName.Count; i++)
{
changeColumns += Table.ColumnName[i] + "=@" + Table.ColumnName[i];
if (Table.ColumnName.Count - 1 != i)
changeColumns += ",";
}
adap.UpdateCommand = new OleDbCommand("UPDATE [" + xlsSheet + "] SET " + changeColumns +
" WHERE " + Table.ColumnName[PrimaryColumnIndex] + " = @" + Table.ColumnName[PrimaryColumnIndex], conn);
for (int i = 0; i < Table.ColumnName.Count; i++)
{
adap.UpdateCommand.Parameters.Add("@" + Table.ColumnName[i], OleDbType.Char, 255).SourceColumn = Table.ColumnName[i];
}
foreach (int row in ListOfValues.Keys)
{
Table tbl = ListOfValues[row];
ds.Tables[0].Rows[row][Table.ColumnName[PrimaryColumnIndex]] = ds.Tables[0].Rows[row][PrimaryColumnIndex];
for (int i = 0; i < tbl.Value.Count; i++)
{
ds.Tables[0].Rows[row][Table.ColumnName[tbl.col[i]]] = tbl.Value[i];
}
adap.Update(ds.Tables[0]);
}
conn.Close();
MessageBox.Show("Updated");
}
bool isFormLoad = false;
int PrimaryColumnIndex = 0;
OleDbDataAdapter adap;
DataSet ds;
OleDbConnection conn;
OleDbCommandBuilder builder;
Dictionary<int, Table> ListOfValues = new Dictionary<int, Table>();
public class Table
{
public List<string> Value { get; set; }
public List<int> col { get; set; }
public static List<string> ColumnName;
}
private void Form1_Load(object sender, EventArgs e)
{
conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0";
conn.Open();
adap = new OleDbDataAdapter("SELECT * FROM [PR$]", conn);
ds = new DataSet();
adap.Fill(ds, "PR");
Table.ColumnName = new List<string>();
foreach (DataColumn str in ds.Tables[0].Columns)
{
Table.ColumnName.Add(str.ColumnName);
}
dgPR.DataSource = ds.Tables[0];
conn.Close();
dgPR.Columns[PrimaryColumnIndex].ReadOnly = true;
dgPR.RowValidated += new DataGridViewCellEventHandler(dgPR_RowValidated);
isFormLoad = true;
}
private void dgPR_RowValidated(object sender, DataGridViewCellEventArgs e)
{
if (isFormLoad)
{
Table tbl = new Table();
DataGridView dgv = (DataGridView)sender;
tbl.Value = new List<string>();
tbl.col = new List<int>();
for (int i = 1; i < dgv.ColumnCount; i++)
{
tbl.Value.Add(dgv.Rows[e.RowIndex].Cells[i].Value.ToString());
tbl.col.Add(i);
}
if (ListOfValues.Keys.Contains(e.RowIndex))
{
ListOfValues[e.RowIndex] = tbl;
}
else
ListOfValues.Add(e.RowIndex, tbl);
}
}
kindly change PrimaryColumnIndex
which you want to be not change in Excel File.
Update:
Replace btnUpdate_Click
through this.
private void btnUpdate_Click(object sender, EventArgs e)
{
conn.Open();
string xlsSheet = "PR$";
DataTable dt = (DataTable)dgPR.DataSource;
string changeColumns = "";
for (int i = 0; i < Table.ColumnName.Count; i++)
{
changeColumns += "[" + Table.ColumnName[i] + "]"+ "=@" + Table.ColumnName[i];
if (Table.ColumnName.Count - 1 != i)
changeColumns += ",";
}
adap.UpdateCommand = new OleDbCommand("UPDATE [" + xlsSheet + "] SET " + changeColumns +
" WHERE " + "["+ Table.ColumnName[PrimaryColumnIndex] +
"]"+ " = @" + Table.ColumnName[PrimaryColumnIndex], conn);
for (int i = 0; i < Table.ColumnName.Count; i++)
{
adap.UpdateCommand.Parameters.Add("@" + Table.ColumnName[i], OleDbType.Char, 255).SourceColumn = Table.ColumnName[i];
}
foreach (int row in ListOfValues.Keys)
{
Table tbl = ListOfValues[row];
ds.Tables[0].Rows[row][Table.ColumnName[PrimaryColumnIndex]] = ds.Tables[0].Rows[row][PrimaryColumnIndex];
for (int i = 0; i < tbl.Value.Count; i++)
{
ds.Tables[0].Rows[row][Table.ColumnName[tbl.col[i]]] = tbl.Value[i];
}
adap.Update(ds.Tables[0]);
}
conn.Close();
MessageBox.Show("Updated");
}
Update 2 :
It is throwing error Because, Space is not supported in Query between Feilds Name.
Again update btnUpdate_Click
from following Code
private void btnUpdate_Click(object sender, EventArgs e)
{
conn.Open();
string xlsSheet = "PR$";
DataTable dt = (DataTable)dgPR.DataSource;
string changeColumns = "";
for (int i = 0; i < Table.ColumnName.Count; i++)
{
changeColumns += "[" + Table.ColumnName[i] + "]"+ "=@" + Table.ColumnName[i].Replace(' ','_');
if (Table.ColumnName.Count - 1 != i)
changeColumns += ",";
}
adap.UpdateCommand = new OleDbCommand("UPDATE [" + xlsSheet + "] SET " + changeColumns +
" WHERE " + "["+ Table.ColumnName[PrimaryColumnIndex] +
"]"+ " = @" + Table.ColumnName[PrimaryColumnIndex].Replace(' ','_'), conn);
for (int i = 0; i < Table.ColumnName.Count; i++)
{
adap.UpdateCommand.Parameters.Add("@" + Table.ColumnName[i].Replace(' ','_'), OleDbType.Char, 255).SourceColumn = Table.ColumnName[i];
}
foreach (int row in ListOfValues.Keys)
{
Table tbl = ListOfValues[row];
ds.Tables[0].Rows[row][Table.ColumnName[PrimaryColumnIndex]] = ds.Tables[0].Rows[row][PrimaryColumnIndex];
for (int i = 0; i < tbl.Value.Count; i++)
{
ds.Tables[0].Rows[row][Table.ColumnName[tbl.col[i]]] = tbl.Value[i];
}
adap.Update(ds.Tables[0]);
}
conn.Close();
MessageBox.Show("Updated");
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.